# SPDX-License-Identifier: GPL-2.0-or-later """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, ) 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): """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, ) classes = ( MaterialRaytraceTransparency, MaterialRaytraceMirror, MaterialSubsurfaceScattering, ) def register(): for cls in classes: register_class(cls) bpy.types.Material.pov_raytrace_transparency = PointerProperty( type=MaterialRaytraceTransparency ) bpy.types.Material.pov_subsurface_scattering = PointerProperty( type=MaterialSubsurfaceScattering ) bpy.types.Material.pov_raytrace_mirror = PointerProperty(type=MaterialRaytraceMirror) def unregister(): del bpy.types.Material.pov_subsurface_scattering del bpy.types.Material.pov_raytrace_mirror del bpy.types.Material.pov_raytrace_transparency for cls in reversed(classes): unregister_class(cls)