Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaurice Raybaud <mauriceraybaud@hotmail.fr>2021-05-26 02:34:50 +0300
committerMaurice Raybaud <mauriceraybaud@hotmail.fr>2021-05-26 02:34:50 +0300
commitfad5186bb6880aadbb0cd9d983035c7890801aa7 (patch)
tree60e57ddcefbf423cde567e296e9128ace77e6ed3 /render_povray/shading_properties.py
parent051d4f7d5951924015d7c2e6bddeb28fac229f1c (diff)
Formatting and fixes
* Moved: some existing functions into new separate files to improve code readability (detailed in __init__.py docstring) * Remove: max_intersections deprecated in pov 3.8 * Add: Validate utf-8 characters with specific API function at session's first script init * Add : Icons to some text fields and inviting labels * Change default camera normal perturbation value to non zero since its use is first driven by a boolean toggle * Change: lists (vectors and indices) are now exported in one line by default for better manual scene overview and debugging * Change: a couple of tooltips corrections * Change : renamed many variables and functions to snake_case according to recommanded style guides * Fix : Heightfield primitive (forward slashes were expected for displacement texture path) * Fix : Text nippet insertion operator * Fix : added console print tip to check executable path on failure to process * Fix : tweaked finished render say command for Linux * Fix : interface of some shader nodes broken since 2.8 api changes * Fix : export hair particles
Diffstat (limited to 'render_povray/shading_properties.py')
-rwxr-xr-xrender_povray/shading_properties.py2290
1 files changed, 2290 insertions, 0 deletions
diff --git a/render_povray/shading_properties.py b/render_povray/shading_properties.py
new file mode 100755
index 00000000..18895eba
--- /dev/null
+++ b/render_povray/shading_properties.py
@@ -0,0 +1,2290 @@
+# ##### 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>
+"""Declare shading properties exported to POV textures."""
+import bpy
+from bpy.utils import register_class, unregister_class
+from bpy.types import PropertyGroup
+from bpy.props import (
+ FloatVectorProperty,
+ StringProperty,
+ BoolProperty,
+ IntProperty,
+ FloatProperty,
+ EnumProperty,
+ PointerProperty,
+)
+
+
+def check_material(mat):
+ """Check that material node tree is not empty if use node button is on"""
+ if mat is not None:
+ if mat.use_nodes:
+ if not mat.node_tree: # FORMERLY : #mat.active_node_material is not None:
+ return True
+ return False
+ return True
+ return False
+
+
+def pov_context_tex_datablock(context):
+ """Texture context type recreated as deprecated in blender 2.8"""
+
+ idblock = context.brush
+ if idblock and context.scene.texture_context == 'OTHER':
+ return idblock
+
+ # idblock = bpy.context.active_object.active_material
+ idblock = context.view_layer.objects.active.active_material
+ if idblock and context.scene.texture_context == 'MATERIAL':
+ return idblock
+
+ idblock = context.scene.world
+ if idblock and context.scene.texture_context == 'WORLD':
+ return idblock
+
+ idblock = context.light
+ if idblock and context.scene.texture_context == 'LIGHT':
+ return idblock
+
+ if context.particle_system and context.scene.texture_context == 'PARTICLES':
+ idblock = context.particle_system.settings
+
+ return idblock
+
+ idblock = context.line_style
+ if idblock and context.scene.texture_context == 'LINESTYLE':
+ return idblock
+
+
+def active_texture_name_from_uilist(self, context):
+ """Name created texture slots the same as created texture"""
+ idblock = pov_context_tex_datablock(context)
+ # mat = context.view_layer.objects.active.active_material
+ if idblock is not None:
+ index = idblock.pov.active_texture_index
+ name = idblock.pov_texture_slots[index].name
+ newname = idblock.pov_texture_slots[index].texture
+ tex = bpy.data.textures[name]
+ tex.name = newname
+ idblock.pov_texture_slots[index].name = newname
+
+
+def active_texture_name_from_search(self, context):
+ """Texture rolldown to change the data linked by an existing texture"""
+ idblock = pov_context_tex_datablock(context)
+ # mat = context.view_layer.objects.active.active_material
+ if idblock is not None:
+ index = idblock.pov.active_texture_index
+ slot = idblock.pov_texture_slots[index]
+ name = slot.texture_search
+
+ try:
+ # tex = bpy.data.textures[name]
+ slot.name = name
+ slot.texture = name
+ # Switch paint brush to this texture so settings remain contextual
+ # bpy.context.tool_settings.image_paint.brush.texture = tex
+ # bpy.context.tool_settings.image_paint.brush.mask_texture = tex
+ except BaseException as e:
+ print(e.__doc__)
+ print('An exception occurred: {}'.format(e))
+ pass
+
+
+def brush_texture_update(self, context):
+
+ """Brush texture rolldown must show active slot texture props"""
+ idblock = pov_context_tex_datablock(context)
+ if idblock is not None:
+ # mat = context.view_layer.objects.active.active_material
+ idblock = pov_context_tex_datablock(context)
+ slot = idblock.pov_texture_slots[idblock.pov.active_texture_index]
+ tex = slot.texture
+
+ if tex:
+ # Switch paint brush to active texture so slot and settings remain contextual
+ bpy.context.tool_settings.image_paint.brush.texture = bpy.data.textures[tex]
+ bpy.context.tool_settings.image_paint.brush.mask_texture = bpy.data.textures[tex]
+
+
+class RenderPovSettingsMaterial(PropertyGroup):
+ """Declare material level properties controllable in UI and translated to POV."""
+
+ ######################Begin Old Blender Internal Props#########################
+ # former Space properties from removed Blender Internal
+ use_limited_texture_context: BoolProperty(
+ name="",
+ description="Use the limited version of texture user (for ‘old shading’ mode)",
+ default=True,
+ )
+ texture_context: EnumProperty(
+ name="Texture context",
+ description="Type of texture data to display and edit",
+ items=(
+ ("MATERIAL", "", "Show material textures", "MATERIAL", 0), # "Show material textures"
+ ("WORLD", "", "Show world textures", "WORLD", 1), # "Show world textures"
+ ("LAMP", "", "Show lamp textures", "LIGHT", 2), # "Show lamp textures"
+ (
+ "PARTICLES",
+ "",
+ "Show particles textures",
+ "PARTICLES",
+ 3,
+ ), # "Show particles textures"
+ (
+ "LINESTYLE",
+ "",
+ "Show linestyle textures",
+ "LINE_DATA",
+ 4,
+ ), # "Show linestyle textures"
+ (
+ "OTHER",
+ "",
+ "Show other data textures",
+ "TEXTURE_DATA",
+ 5,
+ ), # "Show other data textures"
+ ),
+ default="MATERIAL",
+ )
+
+ active_texture_index: IntProperty(
+ name="Index for texture_slots", default=0, update=brush_texture_update
+ )
+
+ transparency_method: EnumProperty(
+ name="Specular Shader Model",
+ description="Method to use for rendering transparency",
+ items=(
+ ("MASK", "Mask", "Mask the background"),
+ ("Z_TRANSPARENCY", "Z Transparency", "Use alpha buffer for transparent faces"),
+ ("RAYTRACE", "Raytrace", "Use raytracing for transparent refraction rendering"),
+ ),
+ default="MASK",
+ )
+
+ use_transparency: BoolProperty(
+ name="Transparency", description="Render material as transparent", default=False
+ )
+
+ alpha: FloatProperty(
+ name="Alpha",
+ description="Alpha transparency of the material",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=1.0,
+ precision=3,
+ )
+
+ specular_alpha: FloatProperty(
+ name="Specular alpha",
+ description="Alpha transparency for specular areas",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=1.0,
+ precision=3,
+ )
+
+ ambient: FloatProperty(
+ name="Ambient",
+ description="Amount of global ambient color the material receives",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=1.0,
+ precision=3,
+ )
+
+ diffuse_color: FloatVectorProperty(
+ name="Diffuse color",
+ description=("Diffuse color of the material"),
+ precision=4,
+ step=0.01,
+ min=0, # max=inf, soft_max=1,
+ default=(0.6, 0.6, 0.6),
+ options={"ANIMATABLE"},
+ subtype="COLOR",
+ )
+
+ darkness: FloatProperty(
+ name="Darkness",
+ description="Minnaert darkness",
+ min=0.0,
+ max=2.0,
+ soft_min=0.0,
+ soft_max=2.0,
+ default=1.0,
+ precision=3,
+ )
+
+ diffuse_fresnel: FloatProperty(
+ name="Diffuse fresnel",
+ description="Power of Fresnel",
+ min=0.0,
+ max=5.0,
+ soft_min=0.0,
+ soft_max=5.0,
+ default=1.0,
+ precision=3,
+ )
+
+ diffuse_fresnel_factor: FloatProperty(
+ name="Diffuse fresnel factor",
+ description="Blending factor of Fresnel",
+ min=0.0,
+ max=5.0,
+ soft_min=0.0,
+ soft_max=5.0,
+ default=0.5,
+ precision=3,
+ )
+
+ diffuse_intensity: FloatProperty(
+ name="Diffuse intensity",
+ description="Amount of diffuse reflection multiplying color",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=0.8,
+ precision=3,
+ )
+
+ diffuse_ramp_blend: EnumProperty(
+ name="Diffuse ramp blend",
+ description="Blending method of the ramp and the diffuse color",
+ items=(
+ ("MIX", "Mix", ""),
+ ("ADD", "Add", ""),
+ ("MULTIPLY", "Multiply", ""),
+ ("SUBTRACT", "Subtract", ""),
+ ("SCREEN", "Screen", ""),
+ ("DIVIDE", "Divide", ""),
+ ("DIFFERENCE", "Difference", ""),
+ ("DARKEN", "Darken", ""),
+ ("LIGHTEN", "Lighten", ""),
+ ("OVERLAY", "Overlay", ""),
+ ("DODGE", "Dodge", ""),
+ ("BURN", "Burn", ""),
+ ("HUE", "Hue", ""),
+ ("SATURATION", "Saturation", ""),
+ ("VALUE", "Value", ""),
+ ("COLOR", "Color", ""),
+ ("SOFT_LIGHT", "Soft light", ""),
+ ("LINEAR_LIGHT", "Linear light", ""),
+ ),
+ default="MIX",
+ )
+
+ diffuse_ramp_factor: FloatProperty(
+ name="Factor",
+ description="Blending factor (also uses alpha in Colorband)",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=1.0,
+ precision=3,
+ )
+
+ diffuse_ramp_input: EnumProperty(
+ name="Input",
+ description="How the ramp maps on the surface",
+ items=(
+ ("SHADER", "Shader", ""),
+ ("ENERGY", "Energy", ""),
+ ("NORMAL", "Normal", ""),
+ ("RESULT", "Result", ""),
+ ),
+ default="SHADER",
+ )
+
+ diffuse_shader: EnumProperty(
+ name="Diffuse Shader Model",
+ description="How the ramp maps on the surface",
+ items=(
+ ("LAMBERT", "Lambert", "Use a Lambertian shader"),
+ ("OREN_NAYAR", "Oren-Nayar", "Use an Oren-Nayar shader"),
+ ("MINNAERT", "Minnaert", "Use a Minnaert shader"),
+ ("FRESNEL", "Fresnel", "Use a Fresnel shader"),
+ ),
+ default="LAMBERT",
+ )
+
+ diffuse_toon_size: FloatProperty(
+ name="Size",
+ description="Size of diffuse toon area",
+ min=0.0,
+ max=3.14,
+ soft_min=0.0,
+ soft_max=3.14,
+ default=0.5,
+ precision=3,
+ )
+
+ diffuse_toon_smooth: FloatProperty(
+ name="Smooth",
+ description="Smoothness of diffuse toon area",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=0.1,
+ precision=3,
+ )
+
+ emit: FloatProperty(
+ name="Emit",
+ description="Amount of light to emit",
+ min=0.0,
+ soft_min=0.0, # max=inf, soft_max=inf,
+ default=0.0,
+ precision=3,
+ )
+
+ mirror_color: FloatVectorProperty(
+ name="Mirror color",
+ description=("Mirror color of the material"),
+ precision=4,
+ step=0.01,
+ min=0, # max=inf, soft_max=1,
+ default=(0.6, 0.6, 0.6),
+ options={"ANIMATABLE"},
+ subtype="COLOR",
+ )
+
+ roughness: FloatProperty(
+ name="Roughness",
+ description="Oren-Nayar Roughness",
+ min=0.0,
+ max=3.14,
+ soft_min=0.0,
+ soft_max=3.14,
+ precision=3,
+ default=0.5,
+ )
+
+ halo: BoolProperty(name="Halo", description=" Halo settings for the material", default=False)
+ # (was readonly in Blender2.79, never None)
+
+ line_color: FloatVectorProperty(
+ name="Line color",
+ description=("Line color used for Freestyle line rendering"),
+ precision=4,
+ step=0.01,
+ min=0, # max=inf, soft_max=1,
+ default=(0.0, 0.0, 0.0),
+ options={"ANIMATABLE"},
+ subtype="COLOR",
+ )
+
+ # diffuse_ramp:
+ ## Color ramp used to affect diffuse shading
+ ## Type: ColorRamp, (readonly)
+
+ # cr_node = bpy.data.materials['Material'].node_tree.nodes['ColorRamp']
+ # layout.template_color_ramp(cr_node, "color_ramp", expand=True)
+
+ # ou
+
+ # class bpy.types.ColorRamp(bpy_struct)
+
+ line_priority: IntProperty(
+ name="Recursion Limit",
+ description="The line color of a higher priority is used at material boundaries",
+ min=0,
+ max=32767,
+ default=0,
+ )
+
+ specular_color: FloatVectorProperty(
+ name="Specular color",
+ description=("Specular color of the material "),
+ precision=4,
+ step=0.01,
+ min=0, # max=inf, soft_max=1,
+ default=(1.0, 1.0, 1.0),
+ options={"ANIMATABLE"},
+ subtype="COLOR",
+ )
+
+ specular_hardness: IntProperty(
+ name="Hardness",
+ description="How hard (sharp) the specular reflection is",
+ min=1,
+ max=511,
+ default=30,
+ )
+
+ specular_intensity: FloatProperty(
+ name="Intensity",
+ description="How intense (bright) the specular reflection is",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=0.1,
+ precision=3,
+ )
+
+ specular_ior: FloatProperty(
+ name="IOR",
+ description="Specular index of refraction",
+ min=-10.0,
+ max=10.0,
+ soft_min=0.0,
+ soft_max=10.0,
+ default=1.0,
+ precision=3,
+ )
+
+ ior: FloatProperty(
+ name="IOR",
+ description="Index of refraction",
+ min=-10.0,
+ max=10.0,
+ soft_min=0.0,
+ soft_max=10.0,
+ default=1.0,
+ precision=3,
+ )
+
+ specular_shader: EnumProperty(
+ name="Specular Shader Model",
+ description="How the ramp maps on the surface",
+ items=(
+ ("COOKTORR", "CookTorr", "Use a Cook-Torrance shader"),
+ ("PHONG", "Phong", "Use a Phong shader"),
+ ("BLINN", "Blinn", "Use a Blinn shader"),
+ ("TOON", "Toon", "Use a Toon shader"),
+ ("WARDISO", "WardIso", "Use a Ward anisotropic shader"),
+ ),
+ default="COOKTORR",
+ )
+
+ specular_slope: FloatProperty(
+ name="Slope",
+ description="The standard deviation of surface slope",
+ min=0.0,
+ max=0.4,
+ soft_min=0.0,
+ soft_max=0.4,
+ default=0.1,
+ precision=3,
+ )
+
+ specular_toon_size: FloatProperty(
+ name="Size",
+ description="Size of specular toon area",
+ min=0.0,
+ max=0.53,
+ soft_min=0.0,
+ soft_max=0.53,
+ default=0.5,
+ precision=3,
+ )
+
+ specular_toon_smooth: FloatProperty(
+ name="Smooth",
+ description="Smoothness of specular toon area",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=0.1,
+ precision=3,
+ )
+
+ translucency: FloatProperty(
+ name="Translucency",
+ description="Amount of diffuse shading on the back side",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=0.0,
+ precision=3,
+ )
+
+ transparency_method: EnumProperty(
+ name="Specular Shader Model",
+ description="Method to use for rendering transparency",
+ items=(
+ ("MASK", "Mask", "Mask the background"),
+ ("Z_TRANSPARENCY", "Z Transparency", "Use an ior of 1 for transparent faces"),
+ ("RAYTRACE", "Raytrace", "Use raytracing for transparent refraction rendering"),
+ ),
+ default="MASK",
+ )
+
+ type: EnumProperty(
+ name="Type",
+ description="Material type defining how the object is rendered",
+ items=(
+ ("SURFACE", "Surface", "Render object as a surface"),
+ # TO UPDATE > USE wire MACRO AND CHANGE DESCRIPTION
+ ("WIRE", "Wire", "Render the edges of faces as wires (not supported in raytracing)"),
+ ("VOLUME", "Volume", "Render object as a volume"),
+ # TO UPDATE > USE halo MACRO AND CHANGE DESCRIPTION
+ ("HALO", "Halo", "Render object as halo particles"),
+ ),
+ default="SURFACE",
+ )
+
+ use_cast_shadows: BoolProperty(
+ name="Cast", description="Allow this material to cast shadows", default=True
+ )
+
+ use_cast_shadows_only: BoolProperty(
+ name="Cast Only",
+ description="Make objects with this material "
+ "appear invisible (not rendered), only "
+ "casting shadows",
+ default=False,
+ )
+
+ use_cubic: BoolProperty(
+ name="Cubic Interpolation",
+ description="Use cubic interpolation for diffuse " "values, for smoother transitions",
+ default=False,
+ )
+
+ use_diffuse_ramp: BoolProperty(
+ name="Ramp", description="Toggle diffuse ramp operations", default=False
+ )
+
+ use_light_group_exclusive: BoolProperty(
+ name="Exclusive",
+ description="Material uses the light group exclusively"
+ "- these lamps are excluded from other "
+ "scene lighting",
+ default=False,
+ )
+
+ use_light_group_local: BoolProperty(
+ name="Local",
+ description="When linked in, material uses local light" " group with the same name",
+ default=False,
+ )
+
+ use_mist: BoolProperty(
+ name="Use Mist",
+ description="Use mist with this material " "(in world settings)",
+ default=True,
+ )
+
+ use_nodes: BoolProperty(
+ name="Nodes",
+ # Add Icon in UI or here? icon='NODES'
+ description="Use shader nodes to render the material",
+ default=False,
+ )
+
+ use_object_color: BoolProperty(
+ name="Object Color",
+ description="Modulate the result with a per-object color",
+ default=False,
+ )
+
+ use_only_shadow: BoolProperty(
+ name="Shadows Only",
+ description="Render shadows as the material’s alpha "
+ "value, making the material transparent "
+ "except for shadowed areas",
+ default=False,
+ )
+
+ use_shadeless: BoolProperty(
+ name="Shadeless",
+ description="Make this material insensitive to " "light or shadow",
+ default=False,
+ )
+
+ use_shadows: BoolProperty(
+ name="Receive", description="Allow this material to receive shadows", default=True
+ )
+
+ use_sky: BoolProperty(
+ name="Sky",
+ description="Render this material with zero alpha, "
+ "with sky background in place (scanline only)",
+ default=False,
+ )
+
+ use_specular_ramp: BoolProperty(
+ name="Ramp", description="Toggle specular ramp operations", default=False
+ )
+
+ use_tangent_shading: BoolProperty(
+ name="Tangent Shading",
+ description="Use the material’s tangent vector instead"
+ "of the normal for shading - for "
+ "anisotropic shading effects",
+ default=False,
+ )
+
+ use_transparent_shadows: BoolProperty(
+ name="Receive Transparent",
+ description="Allow this object to receive transparent " "shadows cast through other object",
+ default=False,
+ ) # linked to fake caustics
+
+ use_vertex_color_light: BoolProperty(
+ name="Vertex Color Light",
+ description="Add vertex colors as additional lighting",
+ default=False,
+ )
+
+ use_vertex_color_paint: BoolProperty(
+ name="Vertex Color Paint",
+ description="Replace object base color with vertex "
+ "colors (multiply with ‘texture face’ "
+ "face assigned textures)",
+ default=False,
+ )
+
+ specular_ramp_blend: EnumProperty(
+ name="Specular ramp blend",
+ description="Blending method of the ramp and the specular color",
+ items=(
+ ("MIX", "Mix", ""),
+ ("ADD", "Add", ""),
+ ("MULTIPLY", "Multiply", ""),
+ ("SUBTRACT", "Subtract", ""),
+ ("SCREEN", "Screen", ""),
+ ("DIVIDE", "Divide", ""),
+ ("DIFFERENCE", "Difference", ""),
+ ("DARKEN", "Darken", ""),
+ ("LIGHTEN", "Lighten", ""),
+ ("OVERLAY", "Overlay", ""),
+ ("DODGE", "Dodge", ""),
+ ("BURN", "Burn", ""),
+ ("HUE", "Hue", ""),
+ ("SATURATION", "Saturation", ""),
+ ("VALUE", "Value", ""),
+ ("COLOR", "Color", ""),
+ ("SOFT_LIGHT", "Soft light", ""),
+ ("LINEAR_LIGHT", "Linear light", ""),
+ ),
+ default="MIX",
+ )
+
+ specular_ramp_factor: FloatProperty(
+ name="Factor",
+ description="Blending factor (also uses alpha in Colorband)",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=1.0,
+ precision=3,
+ )
+
+ specular_ramp_input: EnumProperty(
+ name="Input",
+ description="How the ramp maps on the surface",
+ items=(
+ ("SHADER", "Shader", ""),
+ ("ENERGY", "Energy", ""),
+ ("NORMAL", "Normal", ""),
+ ("RESULT", "Result", ""),
+ ),
+ default="SHADER",
+ )
+
+ irid_enable: BoolProperty(
+ name="Iridescence coating",
+ description="Newton's thin film interference (like an oil slick on a puddle of "
+ "water or the rainbow hues of a soap bubble.)",
+ default=False,
+ )
+
+ mirror_use_IOR: BoolProperty(
+ name="Correct Reflection",
+ description="Use same IOR as raytrace transparency to calculate mirror reflections. "
+ "More physically correct",
+ default=False,
+ )
+
+ mirror_metallic: BoolProperty(
+ name="Metallic Reflection",
+ description="mirror reflections get colored as diffuse (for metallic materials)",
+ default=False,
+ )
+
+ conserve_energy: BoolProperty(
+ name="Conserve Energy",
+ description="Light transmitted is more correctly reduced by mirror reflections, "
+ "also the sum of diffuse and translucency gets reduced below one ",
+ default=True,
+ )
+
+ irid_amount: FloatProperty(
+ name="amount",
+ description="Contribution of the iridescence effect to the overall surface color. "
+ "As a rule of thumb keep to around 0.25 (25% contribution) or less, "
+ "but experiment. If the surface is coming out too white, try lowering "
+ "the diffuse and possibly the ambient values of the surface",
+ min=0.0,
+ max=1.0,
+ soft_min=0.01,
+ soft_max=1.0,
+ default=0.25,
+ )
+
+ irid_thickness: FloatProperty(
+ name="thickness",
+ description="A very thin film will have a high frequency of color changes while a "
+ "thick film will have large areas of color",
+ min=0.0,
+ max=1000.0,
+ soft_min=0.1,
+ soft_max=10.0,
+ default=1,
+ )
+
+ irid_turbulence: FloatProperty(
+ name="turbulence",
+ description="This parameter varies the thickness",
+ min=0.0,
+ max=10.0,
+ soft_min=0.000,
+ soft_max=1.0,
+ default=0,
+ )
+
+ interior_fade_color: FloatVectorProperty(
+ name="Interior Fade Color",
+ description="Color of filtered attenuation for transparent " "materials",
+ precision=4,
+ step=0.01,
+ min=0.0,
+ soft_max=1.0,
+ default=(0, 0, 0),
+ options={"ANIMATABLE"},
+ subtype="COLOR",
+ )
+
+ caustics_enable: BoolProperty(
+ name="Caustics",
+ description="use only fake refractive caustics (default) or photon based "
+ "reflective/refractive caustics",
+ default=True,
+ )
+
+ fake_caustics: BoolProperty(
+ name="Fake Caustics", description="use only (Fast) fake refractive caustics", default=True
+ )
+
+ fake_caustics_power: FloatProperty(
+ name="Fake caustics power",
+ description="Values typically range from 0.0 to 1.0 or higher. Zero is no caustics. "
+ "Low, non-zero values give broad hot-spots while higher values give "
+ "tighter, smaller simulated focal points",
+ min=0.00,
+ max=10.0,
+ soft_min=0.00,
+ soft_max=5.0,
+ default=0.15,
+ )
+
+ refraction_caustics: BoolProperty(
+ name="Refractive Caustics",
+ description="hotspots of light focused when going through the material",
+ default=True,
+ )
+
+ photons_dispersion: FloatProperty(
+ name="Chromatic Dispersion",
+ description="Light passing through will be separated according to wavelength. "
+ "This ratio of refractive indices for violet to red controls how much "
+ "the colors are spread out 1 = no dispersion, good values are 1.01 to 1.1",
+ min=1.0000,
+ max=10.000,
+ soft_min=1.0000,
+ soft_max=1.1000,
+ precision=4,
+ default=1.0000,
+ )
+
+ photons_dispersion_samples: IntProperty(
+ name="Dispersion Samples",
+ description="Number of color-steps for dispersion",
+ min=2,
+ max=128,
+ default=7,
+ )
+
+ photons_reflection: BoolProperty(
+ name="Reflective Photon Caustics",
+ description="Use this to make your Sauron's ring ;-P",
+ default=False,
+ )
+
+ refraction_type: EnumProperty(
+ items=[
+ ("1", "Z Transparency Fake Caustics", "use fake caustics"),
+ ("2", "Raytrace Photons Caustics", "use photons for refractive caustics"),
+ ],
+ name="Refraction Type:",
+ description="use fake caustics (fast) or true photons for refractive Caustics",
+ default="1",
+ )
+
+ ##################################CustomPOV Code############################
+ replacement_text: StringProperty(
+ name="Declared name:",
+ description="Type the variable name as declared either directly inlined "
+ "in your custom POV code from the text editor datablock (checked as a "
+ "source to render in it's side property panel), or this declaration can be "
+ "from an external .inc it points at. Here, name = texture {} expected",
+ default="",
+ )
+
+ # NODES
+
+ def use_material_nodes_callback(self, context):
+ """Identify if node has been added and if it is used yet or default"""
+
+ if hasattr(context.space_data, "tree_type"):
+ context.space_data.tree_type = "ObjectNodeTree"
+ mat = context.object.active_material
+ if mat.pov.material_use_nodes:
+ mat.use_nodes = True
+ tree = mat.node_tree
+ # tree.name = mat.name # XXX READONLY
+ links = tree.links
+ default = True
+ if len(tree.nodes) == 2:
+ o = 0
+ m = 0
+ for node in tree.nodes:
+ if node.type in {"OUTPUT", "MATERIAL"}:
+ tree.nodes.remove(node)
+ default = True
+ for node in tree.nodes:
+ if node.bl_idname == "PovrayOutputNode":
+ o += 1
+ if node.bl_idname == "PovrayTextureNode":
+ m += 1
+ if o == 1 and m == 1:
+ default = False
+ elif len(tree.nodes) == 0:
+ default = True
+ else:
+ default = False
+ if default:
+ output = tree.nodes.new("PovrayOutputNode")
+ output.location = 200, 200
+ tmap = tree.nodes.new("PovrayTextureNode")
+ tmap.location = 0, 200
+ links.new(tmap.outputs[0], output.inputs[0])
+ tmap.select = True
+ tree.nodes.active = tmap
+ else:
+ mat.use_nodes = False
+
+ def use_texture_nodes_callback(self, context):
+ """Identify texture nodes by filtering out output and composite ones"""
+
+ tex = context.object.active_material.active_texture
+ if tex.pov.texture_use_nodes:
+ tex.use_nodes = True
+ if len(tex.node_tree.nodes) == 2:
+ for node in tex.node_tree.nodes:
+ if node.type in {"OUTPUT", "CHECKER"}:
+ tex.node_tree.nodes.remove(node)
+ else:
+ tex.use_nodes = False
+
+ def node_active_callback(self, context):
+ """Synchronize active node with material before getting it"""
+
+ items = [] # XXX comment out > remove?
+ mat = context.material
+ mat.node_tree.nodes # XXX comment out > remove?
+ for node in mat.node_tree.nodes:
+ node.select = False
+ for node in mat.node_tree.nodes:
+ if node.name == mat.pov.material_active_node:
+ node.select = True
+ mat.node_tree.nodes.active = node
+
+ return node
+
+ def node_enum_callback(self, context):
+ items = []
+ mat = context.material
+ nodes = mat.node_tree.nodes
+ for node in nodes:
+ items.append(("%s" % node.name, "%s" % node.name, ""))
+ return items
+
+ def pigment_normal_callback(self, context):
+ render = context.scene.pov.render # XXX comment out > remove?
+ items = [("pigment", "Pigment", ""), ("normal", "Normal", "")]
+ # XXX Find any other such traces of hgpovray experiment > remove or deploy ?
+ if render == "hgpovray":
+ items = [
+ ("pigment", "Pigment", ""),
+ ("normal", "Normal", ""),
+ ("modulation", "Modulation", ""),
+ ]
+ return items
+
+ def glow_callback(self, context):
+ scene = context.scene
+ ob = context.object
+ ob.pov.mesh_write_as_old = ob.pov.mesh_write_as
+ if scene.pov.render == "uberpov" and ob.pov.glow:
+ ob.pov.mesh_write_as = "NONE"
+ else:
+ ob.pov.mesh_write_as = ob.pov.mesh_write_as_old
+
+ material_use_nodes: BoolProperty(
+ name="Use nodes", description="", update=use_material_nodes_callback, default=False
+ )
+
+ material_active_node: EnumProperty(
+ name="Active node", description="", items=node_enum_callback, update=node_active_callback
+ )
+
+ preview_settings: BoolProperty(name="Preview Settings", description="", default=False)
+
+ object_preview_transform: BoolProperty(name="Transform object", description="", default=False)
+
+ object_preview_scale: FloatProperty(name="XYZ", min=0.5, max=2.0, default=1.0)
+
+ object_preview_rotate: FloatVectorProperty(
+ name="Rotate", description="", min=-180.0, max=180.0, default=(0.0, 0.0, 0.0), subtype="XYZ"
+ )
+
+ object_preview_bgcontrast: FloatProperty(name="Contrast", min=0.0, max=1.0, default=0.5)
+
+
+class MaterialRaytraceTransparency(PropertyGroup):
+ """Declare transparency panel properties controllable in UI and translated to POV."""
+
+ depth: IntProperty(
+ name="Depth",
+ description="Maximum allowed number of light inter-refractions",
+ min=0,
+ max=32767,
+ default=2,
+ )
+
+ depth_max: FloatProperty(
+ name="Depth",
+ description="Maximum depth for light to travel through the "
+ "transparent material before becoming fully filtered (0.0 is disabled)",
+ min=0,
+ max=100,
+ default=0.0,
+ )
+
+ falloff: FloatProperty(
+ name="Falloff",
+ description="Falloff power for transmissivity filter effect (1.0 is linear)",
+ min=0.1,
+ max=10.0,
+ default=1.0,
+ precision=3,
+ )
+
+ filter: FloatProperty(
+ name="Filter",
+ description="Amount to blend in the material’s diffuse color in raytraced "
+ "transparency (simulating absorption)",
+ min=0.0,
+ max=1.0,
+ default=0.0,
+ precision=3,
+ )
+
+ fresnel: FloatProperty(
+ name="Fresnel",
+ description="Power of Fresnel for transparency (Ray or ZTransp)",
+ min=0.0,
+ max=5.0,
+ soft_min=0.0,
+ soft_max=5.0,
+ default=0.0,
+ precision=3,
+ )
+
+ fresnel_factor: FloatProperty(
+ name="Blend",
+ description="Blending factor for Fresnel",
+ min=0.0,
+ max=5.0,
+ soft_min=0.0,
+ soft_max=5.0,
+ default=1.250,
+ precision=3,
+ )
+
+ gloss_factor: FloatProperty(
+ name="Amount",
+ description="The clarity of the refraction. "
+ "(values < 1.0 give diffuse, blurry refractions)",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=1.0,
+ precision=3,
+ )
+
+ gloss_samples: IntProperty(
+ name="Samples",
+ description="frequency of the noise sample used for blurry refractions",
+ min=0,
+ max=1024,
+ default=18,
+ )
+
+ gloss_threshold: FloatProperty(
+ name="Threshold",
+ description="Threshold for adaptive sampling (if a sample "
+ "contributes less than this amount [as a percentage], "
+ "sampling is stopped)",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=0.005,
+ precision=3,
+ )
+
+ ior: FloatProperty(
+ name="IOR",
+ description="Sets angular index of refraction for raytraced refraction",
+ min=-0.0,
+ max=10.0,
+ soft_min=0.25,
+ soft_max=4.0,
+ default=1.3,
+ )
+
+
+class MaterialRaytraceMirror(PropertyGroup):
+ """Declare reflection panel properties controllable in UI and translated to POV."""
+
+ bl_description = ("Raytraced reflection settings for the Material",)
+
+ use: BoolProperty(name="Mirror", description="Enable raytraced reflections", default=False)
+
+ depth: IntProperty(
+ name="Depth",
+ description="Maximum allowed number of light inter-reflections",
+ min=0,
+ max=32767,
+ default=2,
+ )
+
+ distance: FloatProperty(
+ name="Max Dist",
+ description="Maximum distance of reflected rays "
+ "(reflections further than this range "
+ "fade to sky color or material color)",
+ min=0.0,
+ max=100000.0,
+ soft_min=0.0,
+ soft_max=10000.0,
+ default=0.0,
+ precision=3,
+ )
+
+ fade_to: EnumProperty(
+ items=[
+ ("FADE_TO_SKY", "Fade to sky", ""),
+ ("FADE_TO_MATERIAL", "Fade to material color", ""),
+ ],
+ name="Fade-out Color",
+ description="The color that rays with no intersection within the "
+ "Max Distance take (material color can be best for "
+ "indoor scenes, sky color for outdoor)",
+ default="FADE_TO_SKY",
+ )
+
+ fresnel: FloatProperty(
+ name="Fresnel",
+ description="Power of Fresnel for mirror reflection",
+ min=0.0,
+ max=5.0,
+ soft_min=0.0,
+ soft_max=5.0,
+ default=0.0,
+ precision=3,
+ )
+
+ fresnel_factor: FloatProperty(
+ name="Blend",
+ description="Blending factor for Fresnel",
+ min=0.0,
+ max=5.0,
+ soft_min=0.0,
+ soft_max=5.0,
+ default=1.250,
+ precision=3,
+ )
+
+ gloss_anisotropic: FloatProperty(
+ name="Anisotropic",
+ description="The shape of the reflection, from 0.0 (circular) "
+ "to 1.0 (fully stretched along the tangent",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=1.0,
+ precision=3,
+ )
+
+ gloss_factor: FloatProperty(
+ name="Amount",
+ description="The shininess of the reflection "
+ "(values < 1.0 give diffuse, blurry reflections)",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=1.0,
+ precision=3,
+ )
+
+ gloss_samples: IntProperty(
+ name="Noise",
+ description="Frequency of the noise pattern bumps averaged for blurry reflections",
+ min=0,
+ max=1024,
+ default=18,
+ )
+
+ gloss_threshold: FloatProperty(
+ name="Threshold",
+ description="Threshold for adaptive sampling (if a sample "
+ "contributes less than this amount [as a percentage], "
+ "sampling is stopped)",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=0.005,
+ precision=3,
+ )
+
+ mirror_color: FloatVectorProperty(
+ name="Mirror color",
+ description=("Mirror color of the material"),
+ precision=4,
+ step=0.01,
+ default=(1.0, 1.0, 1.0),
+ options={"ANIMATABLE"},
+ subtype="COLOR",
+ )
+
+ reflect_factor: FloatProperty(
+ name="Reflectivity",
+ description="Amount of mirror reflection for raytrace",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=1.0,
+ precision=3,
+ )
+
+
+class MaterialSubsurfaceScattering(PropertyGroup):
+ r"""Declare SSS/SSTL properties controllable in UI and translated to POV."""
+
+ bl_description = ("Subsurface scattering settings for the material",)
+
+ use: BoolProperty(
+ name="Subsurface Scattering",
+ description="Enable diffuse subsurface scatting " "effects in a material",
+ default=False,
+ )
+
+ back: FloatProperty(
+ name="Back",
+ description="Back scattering weight",
+ min=0.0,
+ max=10.0,
+ soft_min=0.0,
+ soft_max=10.0,
+ default=1.0,
+ precision=3,
+ )
+
+ color: FloatVectorProperty(
+ name="Scattering color",
+ description=("Scattering color"),
+ precision=4,
+ step=0.01,
+ default=(0.604, 0.604, 0.604),
+ options={"ANIMATABLE"},
+ subtype="COLOR",
+ )
+
+ color_factor: FloatProperty(
+ name="Color",
+ description="Blend factor for SSS colors",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=1.0,
+ precision=3,
+ )
+
+ error_threshold: FloatProperty(
+ name="Error",
+ description="Error tolerance (low values are slower and higher quality)",
+ default=0.050,
+ precision=3,
+ )
+
+ front: FloatProperty(
+ name="Front",
+ description="Front scattering weight",
+ min=0.0,
+ max=2.0,
+ soft_min=0.0,
+ soft_max=2.0,
+ default=1.0,
+ precision=3,
+ )
+
+ ior: FloatProperty(
+ name="IOR",
+ description="Index of refraction (higher values are denser)",
+ min=-0.0,
+ max=10.0,
+ soft_min=0.1,
+ soft_max=2.0,
+ default=1.3,
+ )
+
+ radius: FloatVectorProperty(
+ name="RGB Radius",
+ description=("Mean red/green/blue scattering path length"),
+ precision=4,
+ step=0.01,
+ min=0.001,
+ default=(1.0, 1.0, 1.0),
+ options={"ANIMATABLE"},
+ )
+
+ scale: FloatProperty(
+ name="Scale", description="Object scale factor", default=0.100, precision=3
+ )
+
+ texture_factor: FloatProperty(
+ name="Texture",
+ description="Texture scattering blend factor",
+ min=0.0,
+ max=1.0,
+ soft_min=0.0,
+ soft_max=1.0,
+ default=0.0,
+ precision=3,
+ )
+
+
+class MaterialStrandSettings(PropertyGroup):
+ """Declare strand properties controllable in UI and translated to POV."""
+
+ bl_description = ("Strand settings for the material",)
+
+ blend_distance: FloatProperty(
+ name="Distance",
+ description="Worldspace distance over which to blend in the surface normal",
+ min=0.0,
+ max=10.0,
+ soft_min=0.0,
+ soft_max=10.0,
+ default=0.0,
+ precision=3,
+ )
+
+ root_size: FloatProperty(
+ name="Root",
+ description="Start size of strands in pixels or Blender units",
+ min=0.25,
+ default=1.0,
+ precision=5,
+ )
+
+ shape: FloatProperty(
+ name="Shape",
+ description="Positive values make strands rounder, negative ones make strands spiky",
+ min=-0.9,
+ max=0.9,
+ default=0.0,
+ precision=3,
+ )
+
+ size_min: FloatProperty(
+ name="Minimum",
+ description="Minimum size of strands in pixels",
+ min=0.001,
+ max=10.0,
+ default=1.0,
+ precision=3,
+ )
+
+ tip_size: FloatProperty(
+ name="Tip",
+ description="End size of strands in pixels or Blender units",
+ min=0.0,
+ default=1.0,
+ precision=5,
+ )
+
+ use_blender_units: BoolProperty(
+ name="Blender Units",
+ description="Use Blender units for widths instead of pixels",
+ default=False,
+ )
+
+ use_surface_diffuse: BoolProperty(
+ name="Surface diffuse",
+ description="Make diffuse shading more similar to shading the surface",
+ default=False,
+ )
+
+ use_tangent_shading: BoolProperty(
+ name="Tangent Shading",
+ description="Use direction of strands as normal for tangent-shading",
+ default=True,
+ )
+
+ uv_layer: StringProperty(
+ name="UV Layer",
+ # icon="GROUP_UVS",
+ description="Name of UV map to override",
+ default="",
+ )
+
+ width_fade: FloatProperty(
+ name="Width Fade",
+ description="Transparency along the width of the strand",
+ min=0.0,
+ max=2.0,
+ default=0.0,
+ precision=3,
+ )
+
+ # halo
+
+ # Halo settings for the material
+ # Type: MaterialHalo, (readonly, never None)
+
+ # ambient
+
+ # Amount of global ambient color the material receives
+ # Type: float in [0, 1], default 0.0
+
+ # darkness
+
+ # Minnaert darkness
+ # Type: float in [0, 2], default 0.0
+
+ # diffuse_color
+
+ # Diffuse color of the material
+ # Type: float array of 3 items in [0, inf], default (0.0, 0.0, 0.0)
+
+ # diffuse_fresnel
+
+ # Power of Fresnel
+ # Type: float in [0, 5], default 0.0
+
+ # diffuse_fresnel_factor
+
+ # Blending factor of Fresnel
+ # Type: float in [0, 5], default 0.0
+
+ # diffuse_intensity
+
+ # Amount of diffuse reflection
+ # Type: float in [0, 1], default 0.0
+
+ # diffuse_ramp
+
+ # Color ramp used to affect diffuse shading
+ # Type: ColorRamp, (readonly)
+
+ # diffuse_ramp_blend
+
+ # Blending method of the ramp and the diffuse color
+ # Type: enum in [‘MIX’, ‘ADD’, ‘MULTIPLY’, ‘SUBTRACT’, ‘SCREEN’, ‘DIVIDE’, ‘DIFFERENCE’, ‘DARKEN’, ‘LIGHTEN’, ‘OVERLAY’, ‘DODGE’, ‘BURN’, ‘HUE’, ‘SATURATION’, ‘VALUE’, ‘COLOR’, ‘SOFT_LIGHT’, ‘LINEAR_LIGHT’], default ‘MIX’
+
+ # diffuse_ramp_factor
+
+ # Blending factor (also uses alpha in Colorband)
+ # Type: float in [0, 1], default 0.0
+
+ # diffuse_ramp_input
+
+ # How the ramp maps on the surface
+ # Type: enum in [‘SHADER’, ‘ENERGY’, ‘NORMAL’, ‘RESULT’], default ‘SHADER’
+
+ # diffuse_shader
+
+ # LAMBERT Lambert, Use a Lambertian shader.
+ # OREN_NAYAR Oren-Nayar, Use an Oren-Nayar shader.
+ # TOON Toon, Use a toon shader.
+ # MINNAERT Minnaert, Use a Minnaert shader.
+ # FRESNEL Fresnel, Use a Fresnel shader.
+
+ # Type: enum in [‘LAMBERT’, ‘OREN_NAYAR’, ‘TOON’, ‘MINNAERT’, ‘FRESNEL’], default ‘LAMBERT’
+
+ # diffuse_toon_size
+
+ # Size of diffuse toon area
+ # Type: float in [0, 3.14], default 0.0
+
+ # diffuse_toon_smooth
+
+ # Smoothness of diffuse toon area
+ # Type: float in [0, 1], default 0.0
+
+ # emit
+
+ # Amount of light to emit
+ # Type: float in [0, inf], default 0.0
+
+ # game_settings
+
+ # Game material settings
+ # Type: MaterialGameSettings, (readonly, never None)
+
+ # halo
+
+ # Halo settings for the material
+ # Type: MaterialHalo, (readonly, never None)
+
+ # invert_z
+
+ # Render material’s faces with an inverted Z buffer (scanline only)
+ # Type: boolean, default False
+
+ # light_group
+
+ # Limit lighting to lamps in this Group
+ # Type: Group
+
+ # line_color
+
+ # Line color used for Freestyle line rendering
+ # Type: float array of 4 items in [0, inf], default (0.0, 0.0, 0.0, 0.0)
+
+ # line_priority
+
+ # The line color of a higher priority is used at material boundaries
+ # Type: int in [0, 32767], default 0
+
+ # mirror_color
+
+ # Mirror color of the material
+ # Type: float array of 3 items in [0, inf], default (0.0, 0.0, 0.0)
+
+ # node_tree
+
+ # Node tree for node based materials
+ # Type: NodeTree, (readonly)
+
+ # offset_z
+
+ # Give faces an artificial offset in the Z buffer for Z transparency
+ # Type: float in [-inf, inf], default 0.0
+
+ # paint_active_slot
+
+ # Index of active texture paint slot
+ # Type: int in [0, 32767], default 0
+
+ # paint_clone_slot
+
+ # Index of clone texture paint slot
+ # Type: int in [0, 32767], default 0
+
+ # pass_index
+
+ # Index number for the “Material Index” render pass
+ # Type: int in [0, 32767], default 0
+
+ # physics
+
+ # Game physics settings
+ # Type: MaterialPhysics, (readonly, never None)
+
+ # preview_render_type
+
+ # Type of preview render
+
+ # FLAT Flat, Flat XY plane.
+ # SPHERE Sphere, Sphere.
+ # CUBE Cube, Cube.
+ # MONKEY Monkey, Monkey.
+ # HAIR Hair, Hair strands.
+ # SPHERE_A World Sphere, Large sphere with sky.
+
+ # Type: enum in [‘FLAT’, ‘SPHERE’, ‘CUBE’, ‘MONKEY’, ‘HAIR’, ‘SPHERE_A’], default ‘FLAT’
+
+ # raytrace_mirror
+
+ # Raytraced reflection settings for the material
+ # Type: MaterialRaytraceMirror, (readonly, never None)
+
+ # raytrace_transparency
+
+ # Raytraced transparency settings for the material
+ # Type: MaterialRaytraceTransparency, (readonly, never None)
+
+ # roughness
+
+ # Oren-Nayar Roughness
+ # Type: float in [0, 3.14], default 0.0
+
+ # shadow_buffer_bias
+
+ # Factor to multiply shadow buffer bias with (0 is ignore)
+ # Type: float in [0, 10], default 0.0
+
+ # shadow_cast_alpha
+
+ # Shadow casting alpha, in use for Irregular and Deep shadow buffer
+ # Type: float in [0.001, 1], default 0.0
+
+ # shadow_only_type
+
+ # How to draw shadows
+
+ # SHADOW_ONLY_OLD Shadow and Distance, Old shadow only method.
+ # SHADOW_ONLY Shadow Only, Improved shadow only method.
+ # SHADOW_ONLY_SHADED Shadow and Shading, Improved shadow only method which also renders lightless areas as shadows.
+
+ # Type: enum in [‘SHADOW_ONLY_OLD’, ‘SHADOW_ONLY’, ‘SHADOW_ONLY_SHADED’], default ‘SHADOW_ONLY_OLD’
+
+ # shadow_ray_bias
+
+ # Shadow raytracing bias to prevent terminator problems on shadow boundary
+ # Type: float in [0, 0.25], default 0.0
+
+ # specular_color
+
+ # Specular color of the material
+ # Type: float array of 3 items in [0, inf], default (0.0, 0.0, 0.0)
+
+ # specular_hardness
+
+ # How hard (sharp) the specular reflection is
+ # Type: int in [1, 511], default 0
+
+ # specular_intensity
+
+ # How intense (bright) the specular reflection is
+ # Type: float in [0, 1], default 0.0
+
+ # specular_ior
+
+ # Specular index of refraction
+ # Type: float in [1, 10], default 0.0
+
+ # specular_ramp
+
+ # Color ramp used to affect specular shading
+ # Type: ColorRamp, (readonly)
+
+ # specular_ramp_blend
+
+ # Blending method of the ramp and the specular color
+ # Type: enum in [‘MIX’, ‘ADD’, ‘MULTIPLY’, ‘SUBTRACT’, ‘SCREEN’, ‘DIVIDE’, ‘DIFFERENCE’, ‘DARKEN’, ‘LIGHTEN’, ‘OVERLAY’, ‘DODGE’, ‘BURN’, ‘HUE’, ‘SATURATION’, ‘VALUE’, ‘COLOR’, ‘SOFT_LIGHT’, ‘LINEAR_LIGHT’], default ‘MIX’
+
+ # specular_ramp_factor
+
+ # Blending factor (also uses alpha in Colorband)
+ # Type: float in [0, 1], default 0.0
+
+ # specular_ramp_input
+
+ # How the ramp maps on the surface
+ # Type: enum in [‘SHADER’, ‘ENERGY’, ‘NORMAL’, ‘RESULT’], default ‘SHADER’
+ # specular_shader
+
+ # COOKTORR CookTorr, Use a Cook-Torrance shader.
+ # PHONG Phong, Use a Phong shader.
+ # BLINN Blinn, Use a Blinn shader.
+ # TOON Toon, Use a toon shader.
+ # WARDISO WardIso, Use a Ward anisotropic shader.
+
+ # Type: enum in [‘COOKTORR’, ‘PHONG’, ‘BLINN’, ‘TOON’, ‘WARDISO’], default ‘COOKTORR’
+
+ # specular_slope
+
+ # The standard deviation of surface slope
+ # Type: float in [0, 0.4], default 0.0
+
+ # specular_toon_size
+
+ # Size of specular toon area
+ # Type: float in [0, 1.53], default 0.0
+
+ # specular_toon_smooth
+
+ # Smoothness of specular toon area
+ # Type: float in [0, 1], default 0.0
+
+ # strand
+
+ # Strand settings for the material
+ # Type: MaterialStrand, (readonly, never None)
+
+ # subsurface_scattering
+
+ # Subsurface scattering settings for the material
+ # Type: MaterialSubsurfaceScattering, (readonly, never None)
+
+ # texture_paint_images
+
+ # Texture images used for texture painting
+ # Type: bpy_prop_collection of Image, (readonly)
+
+ # texture_paint_slots
+
+ # Texture slots defining the mapping and influence of textures
+ # Type: bpy_prop_collection of TexPaintSlot, (readonly)
+
+ # texture_slots
+
+ # Texture slots defining the mapping and influence of textures
+ # Type: MaterialTextureSlots bpy_prop_collection of MaterialTextureSlot, (readonly)
+
+ # translucency
+
+ # Amount of diffuse shading on the back side
+ # Type: float in [0, 1], default 0.0
+
+ # transparency_method
+
+ # Method to use for rendering transparency
+
+ # MASK Mask, Mask the background.
+ # Z_TRANSPARENCY Z Transparency, Use alpha buffer for transparent faces.
+ # RAYTRACE Raytrace, Use raytracing for transparent refraction rendering.
+
+ # Type: enum in [‘MASK’, ‘Z_TRANSPARENCY’, ‘RAYTRACE’], default ‘MASK’
+
+ # type
+
+ # Material type defining how the object is rendered
+
+ # SURFACE Surface, Render object as a surface.
+ # WIRE Wire, Render the edges of faces as wires (not supported in raytracing).
+ # VOLUME Volume, Render object as a volume.
+ # HALO Halo, Render object as halo particles.
+
+ # Type: enum in [‘SURFACE’, ‘WIRE’, ‘VOLUME’, ‘HALO’], default ‘SURFACE’
+
+ # use_cast_approximate
+
+ # Allow this material to cast shadows when using approximate ambient occlusion
+ # Type: boolean, default False
+
+ # use_cast_buffer_shadows
+
+ # Allow this material to cast shadows from shadow buffer lamps
+ # Type: boolean, default False
+
+ # use_cast_shadows
+
+ # Allow this material to cast shadows
+ # Type: boolean, default False
+
+ # use_cast_shadows_only
+
+ # Make objects with this material appear invisible (not rendered), only casting shadows
+ # Type: boolean, default False
+
+ # use_cubic
+
+ # Use cubic interpolation for diffuse values, for smoother transitions
+ # Type: boolean, default False
+
+ # use_diffuse_ramp
+
+ # Toggle diffuse ramp operations
+ # Type: boolean, default False
+
+ # use_face_texture
+
+ # Replace the object’s base color with color from UV map image textures
+ # Type: boolean, default False
+
+ # use_face_texture_alpha
+
+ # Replace the object’s base alpha value with alpha from UV map image textures
+ # Type: boolean, default False
+
+ # use_full_oversampling
+
+ # Force this material to render full shading/textures for all anti-aliasing samples
+ # Type: boolean, default False
+
+ # use_light_group_exclusive
+
+ # Material uses the light group exclusively - these lamps are excluded from other scene lighting
+ # Type: boolean, default False
+
+ # use_light_group_local
+
+ # When linked in, material uses local light group with the same name
+ # Type: boolean, default False
+
+ # use_mist
+
+ # Use mist with this material (in world settings)
+ # Type: boolean, default False
+
+ # use_nodes
+
+ # Use shader nodes to render the material
+ # Type: boolean, default False
+
+ # use_object_color
+
+ # Modulate the result with a per-object color
+ # Type: boolean, default False
+
+ # use_only_shadow
+
+ # Render shadows as the material’s alpha value, making the material transparent except for shadowed areas
+ # Type: boolean, default False
+
+ # use_ray_shadow_bias
+
+ # Prevent raytraced shadow errors on surfaces with smooth shaded normals (terminator problem)
+ # Type: boolean, default False
+
+ # use_raytrace
+
+ # Include this material and geometry that uses it in raytracing calculations
+ # Type: boolean, default False
+
+ # use_shadeless
+
+ # Make this material insensitive to light or shadow
+ # Type: boolean, default False
+
+ # use_shadows
+
+ # Allow this material to receive shadows
+ # Type: boolean, default False
+
+ # use_sky
+
+ # Render this material with zero alpha, with sky background in place (scanline only)
+ # Type: boolean, default False
+
+ # use_specular_ramp
+
+ # Toggle specular ramp operations
+ # Type: boolean, default False
+
+ # use_tangent_shading
+
+ # Use the material’s tangent vector instead of the normal for shading - for anisotropic shading effects
+ # Type: boolean, default False
+
+ # use_textures
+
+ # Enable/Disable each texture
+ # Type: boolean array of 18 items, default (False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False)
+
+ # use_transparency
+
+ # Render material as transparent
+ # Type: boolean, default False
+
+ # use_transparent_shadows
+
+ # Allow this object to receive transparent shadows cast through other objects
+ # Type: boolean, default False
+
+ # use_uv_project
+
+ # Use to ensure UV interpolation is correct for camera projections (use with UV project modifier)
+ # Type: boolean, default False
+
+ # use_vertex_color_light
+
+ # Add vertex colors as additional lighting
+ # Type: boolean, default False
+
+ # use_vertex_color_paint
+
+ # Replace object base color with vertex colors (multiply with ‘texture face’ face assigned textures)
+ # Type: boolean, default False
+
+ # volume
+
+ # Volume settings for the material
+ # Type: MaterialVolume, (readonly, never None)
+ """
+ (mat.type in {'SURFACE', 'WIRE', 'VOLUME'})
+ "use_transparency")
+
+
+
+ mat.use_transparency and mat.transparency_method == 'Z_TRANSPARENCY'
+
+
+
+
+ col.prop(mat, "use_raytrace")
+ col.prop(mat, "use_full_oversampling")
+
+ sub.prop(mat, "use_sky")
+
+
+ col.prop(mat, "use_cast_shadows", text="Cast")
+ col.prop(mat, "use_cast_shadows_only", text="Cast Only")
+ col.prop(mat, "use_cast_buffer_shadows")
+
+ sub.active = mat.use_cast_buffer_shadows
+ sub.prop(mat, "shadow_cast_alpha", text="Casting Alpha")
+ col.prop(mat, "use_cast_approximate")
+
+
+
+ col.prop(mat, "diffuse_color", text="")
+
+ sub.active = (not mat.use_shadeless)
+
+ sub.prop(mat, "diffuse_intensity", text="Intensity")
+
+
+ col.prop(mat, "diffuse_shader", text="")
+ col.prop(mat, "use_diffuse_ramp", text="Ramp")
+
+
+ if mat.diffuse_shader == 'OREN_NAYAR':
+ col.prop(mat, "roughness")
+ elif mat.diffuse_shader == 'MINNAERT':
+ col.prop(mat, "darkness")
+ elif mat.diffuse_shader == 'TOON':
+
+ row.prop(mat, "diffuse_toon_size", text="Size")
+ row.prop(mat, "diffuse_toon_smooth", text="Smooth")
+ elif mat.diffuse_shader == 'FRESNEL':
+
+ row.prop(mat, "diffuse_fresnel", text="Fresnel")
+ row.prop(mat, "diffuse_fresnel_factor", text="Factor")
+
+ if mat.use_diffuse_ramp:
+
+ col.template_color_ramp(mat, "diffuse_ramp", expand=True)
+
+
+
+ row.prop(mat, "diffuse_ramp_input", text="Input")
+ row.prop(mat, "diffuse_ramp_blend", text="Blend")
+
+ col.prop(mat, "diffuse_ramp_factor", text="Factor")
+
+
+
+
+ col.prop(mat, "specular_color", text="")
+ col.prop(mat, "specular_intensity", text="Intensity")
+
+ col.prop(mat, "specular_shader", text="")
+ col.prop(mat, "use_specular_ramp", text="Ramp")
+
+ if mat.specular_shader in {'COOKTORR', 'PHONG'}:
+ col.prop(mat, "specular_hardness", text="Hardness")
+ elif mat.specular_shader == 'BLINN':
+
+ row.prop(mat, "specular_hardness", text="Hardness")
+ row.prop(mat, "specular_ior", text="IOR")
+ elif mat.specular_shader == 'WARDISO':
+ col.prop(mat, "specular_slope", text="Slope")
+ elif mat.specular_shader == 'TOON':
+
+ row.prop(mat, "specular_toon_size", text="Size")
+ row.prop(mat, "specular_toon_smooth", text="Smooth")
+
+ if mat.use_specular_ramp:
+ layout.separator()
+ layout.template_color_ramp(mat, "specular_ramp", expand=True)
+ layout.separator()
+
+ row = layout.row()
+ row.prop(mat, "specular_ramp_input", text="Input")
+ row.prop(mat, "specular_ramp_blend", text="Blend")
+
+ layout.prop(mat, "specular_ramp_factor", text="Factor")
+
+
+ class MATERIAL_PT_shading(MaterialButtonsPanel, Panel):
+ bl_label = "Shading"
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = context.material
+ engine = context.scene.render.engine
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = active_node_mat(context.material)
+
+ if mat.type in {'SURFACE', 'WIRE'}:
+ split = layout.split()
+
+ col = split.column()
+ sub = col.column()
+ sub.active = not mat.use_shadeless
+ sub.prop(mat, "emit")
+ sub.prop(mat, "ambient")
+ sub = col.column()
+ sub.prop(mat, "translucency")
+
+ col = split.column()
+ col.prop(mat, "use_shadeless")
+ sub = col.column()
+ sub.active = not mat.use_shadeless
+ sub.prop(mat, "use_tangent_shading")
+ sub.prop(mat, "use_cubic")
+
+
+ class MATERIAL_PT_transp(MaterialButtonsPanel, Panel):
+ bl_label = "Transparency"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = context.material
+ engine = context.scene.render.engine
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
+
+ def draw_header(self, context):
+ mat = context.material
+
+ if simple_material(mat):
+ self.layout.prop(mat, "use_transparency", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ base_mat = context.material
+ mat = active_node_mat(context.material)
+ rayt = mat.raytrace_transparency
+
+ if simple_material(base_mat):
+ row = layout.row()
+ row.active = mat.use_transparency
+ row.prop(mat, "transparency_method", expand=True)
+
+ split = layout.split()
+ split.active = base_mat.use_transparency
+
+ col = split.column()
+ col.prop(mat, "alpha")
+ row = col.row()
+ row.active = (base_mat.transparency_method != 'MASK') and (not mat.use_shadeless)
+ row.prop(mat, "specular_alpha", text="Specular")
+
+ col = split.column()
+ col.active = (not mat.use_shadeless)
+ col.prop(rayt, "fresnel")
+ sub = col.column()
+ sub.active = (rayt.fresnel > 0.0)
+ sub.prop(rayt, "fresnel_factor", text="Blend")
+
+ if base_mat.transparency_method == 'RAYTRACE':
+ layout.separator()
+ split = layout.split()
+ split.active = base_mat.use_transparency
+
+ col = split.column()
+ col.prop(rayt, "ior")
+ col.prop(rayt, "filter")
+ col.prop(rayt, "falloff")
+ col.prop(rayt, "depth_max")
+ col.prop(rayt, "depth")
+
+ col = split.column()
+ col.label(text="Gloss:")
+ col.prop(rayt, "gloss_factor", text="Amount")
+ sub = col.column()
+ sub.active = rayt.gloss_factor < 1.0
+ sub.prop(rayt, "gloss_threshold", text="Threshold")
+ sub.prop(rayt, "gloss_samples", text="Samples")
+
+
+ class MATERIAL_PT_mirror(MaterialButtonsPanel, Panel):
+ bl_label = "Mirror"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = context.material
+ engine = context.scene.render.engine
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
+
+ def draw_header(self, context):
+ raym = active_node_mat(context.material).raytrace_mirror
+
+ self.layout.prop(raym, "use", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = active_node_mat(context.material)
+ raym = mat.raytrace_mirror
+
+ layout.active = raym.use
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(raym, "reflect_factor")
+ col.prop(mat, "mirror_color", text="")
+
+ col = split.column()
+ col.prop(raym, "fresnel")
+ sub = col.column()
+ sub.active = (raym.fresnel > 0.0)
+ sub.prop(raym, "fresnel_factor", text="Blend")
+
+ split = layout.split()
+
+ col = split.column()
+ col.separator()
+ col.prop(raym, "depth")
+ col.prop(raym, "distance", text="Max Dist")
+ col.separator()
+ sub = col.split(percentage=0.4)
+ sub.active = (raym.distance > 0.0)
+ sub.label(text="Fade To:")
+ sub.prop(raym, "fade_to", text="")
+
+ col = split.column()
+ col.label(text="Gloss:")
+ col.prop(raym, "gloss_factor", text="Amount")
+ sub = col.column()
+ sub.active = (raym.gloss_factor < 1.0)
+ sub.prop(raym, "gloss_threshold", text="Threshold")
+ sub.prop(raym, "gloss_samples", text="Samples")
+ sub.prop(raym, "gloss_anisotropic", text="Anisotropic")
+
+
+ class MATERIAL_PT_sss(MaterialButtonsPanel, Panel):
+ bl_label = "Subsurface Scattering"
+ bl_options = {'DEFAULT_CLOSED'}
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = context.material
+ engine = context.scene.render.engine
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
+
+ def draw_header(self, context):
+ mat = active_node_mat(context.material)
+ sss = mat.subsurface_scattering
+
+ self.layout.active = (not mat.use_shadeless)
+ self.layout.prop(sss, "use", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = active_node_mat(context.material)
+ sss = mat.subsurface_scattering
+
+ layout.active = (sss.use) and (not mat.use_shadeless)
+
+ row = layout.row().split()
+ sub = row.row(align=True).split(align=True, percentage=0.75)
+ sub.menu("MATERIAL_MT_sss_presets", text=bpy.types.MATERIAL_MT_sss_presets.bl_label)
+ sub.operator("material.sss_preset_add", text="", icon='ZOOMIN')
+ sub.operator("material.sss_preset_add", text="", icon='ZOOMOUT').remove_active = True
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(sss, "ior")
+ col.prop(sss, "scale")
+ col.prop(sss, "color", text="")
+ col.prop(sss, "radius", text="RGB Radius", expand=True)
+
+ col = split.column()
+ sub = col.column(align=True)
+ sub.label(text="Blend:")
+ sub.prop(sss, "color_factor", text="Color")
+ sub.prop(sss, "texture_factor", text="Texture")
+ sub.label(text="Scattering Weight:")
+ sub.prop(sss, "front")
+ sub.prop(sss, "back")
+ col.separator()
+ col.prop(sss, "error_threshold", text="Error")
+
+
+ class MATERIAL_PT_halo(MaterialButtonsPanel, Panel):
+ bl_label = "Halo"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = context.material
+ engine = context.scene.render.engine
+ return mat and (mat.type == 'HALO') and (engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = context.material # don't use node material
+ halo = mat.halo
+
+ def number_but(layout, toggle, number, name, color):
+ row = layout.row(align=True)
+ row.prop(halo, toggle, text="")
+ sub = row.column(align=True)
+ sub.active = getattr(halo, toggle)
+ sub.prop(halo, number, text=name, translate=False)
+ if not color == "":
+ sub.prop(mat, color, text="")
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(mat, "alpha")
+ col.prop(mat, "diffuse_color", text="")
+ col.prop(halo, "seed")
+
+ col = split.column()
+ col.prop(halo, "size")
+ col.prop(halo, "hardness")
+ col.prop(halo, "add")
+
+ layout.label(text="Options:")
+
+ split = layout.split()
+ col = split.column()
+ col.prop(halo, "use_texture")
+ col.prop(halo, "use_vertex_normal")
+ col.prop(halo, "use_extreme_alpha")
+ col.prop(halo, "use_shaded")
+ col.prop(halo, "use_soft")
+
+ col = split.column()
+ number_but(col, "use_ring", "ring_count", iface_("Rings"), "mirror_color")
+ number_but(col, "use_lines", "line_count", iface_("Lines"), "specular_color")
+ number_but(col, "use_star", "star_tip_count", iface_("Star Tips"), "")
+
+
+ class MATERIAL_PT_flare(MaterialButtonsPanel, Panel):
+ bl_label = "Flare"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ @classmethod
+ def poll(cls, context):
+ mat = context.material
+ engine = context.scene.render.engine
+ return mat and (mat.type == 'HALO') and (engine in cls.COMPAT_ENGINES)
+
+ def draw_header(self, context):
+ halo = context.material.halo
+
+ self.layout.prop(halo, "use_flare_mode", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ mat = context.material # don't use node material
+ halo = mat.halo
+
+ layout.active = halo.use_flare_mode
+
+ split = layout.split()
+
+ col = split.column()
+ col.prop(halo, "flare_size", text="Size")
+ col.prop(halo, "flare_boost", text="Boost")
+ col.prop(halo, "flare_seed", text="Seed")
+
+ col = split.column()
+ col.prop(halo, "flare_subflare_count", text="Subflares")
+ col.prop(halo, "flare_subflare_size", text="Subsize")
+
+ """
+
+
+#######################End Old Blender Internal Props##########################
+
+
+classes = (
+ RenderPovSettingsMaterial,
+ MaterialRaytraceTransparency,
+ MaterialRaytraceMirror,
+ MaterialSubsurfaceScattering,
+ MaterialStrandSettings,
+)
+
+
+def register():
+ for cls in classes:
+ register_class(cls)
+
+ bpy.types.Material.pov = PointerProperty(type=RenderPovSettingsMaterial)
+ bpy.types.Material.pov_raytrace_transparency = PointerProperty(
+ type=MaterialRaytraceTransparency
+ )
+ bpy.types.Material.pov_subsurface_scattering = PointerProperty(
+ type=MaterialSubsurfaceScattering
+ )
+ bpy.types.Material.strand = PointerProperty(type=MaterialStrandSettings)
+ bpy.types.Material.pov_raytrace_mirror = PointerProperty(type=MaterialRaytraceMirror)
+
+
+def unregister():
+ del bpy.types.Material.pov_subsurface_scattering
+ del bpy.types.Material.strand
+ del bpy.types.Material.pov_raytrace_mirror
+ del bpy.types.Material.pov_raytrace_transparency
+ del bpy.types.Material.pov
+
+ for cls in reversed(classes):
+ unregister_class(cls)