Skip to content
Snippets Groups Projects
__init__.py 183 KiB
Newer Older
  • Learn to ignore specific revisions
  • # ##### BEGIN GPL LICENSE BLOCK #####
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    #
    #  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 #####
    
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    """Import, export and render to POV engines.
    
    These engines can be POV-Ray or Uberpov but others too, since POV is a
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    Scene Description Language. The script has been split in as few files
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    as possible :
    
    ___init__.py :
    
        Initialize properties
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    update_files.py
    
        Update new variables to values from older API. This file needs an update
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    ui.py :
    
        Provide property buttons for the user to set up the variables
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    primitives.py :
    
        Display some POV native primitives in 3D view for input and output
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    
    shading.py
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        Translate shading properties to declared textures at the top of a pov file
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    
    nodes.py
        Translate node trees to the pov file
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    df3.py
        Render smoke to *.df3 files
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    render.py :
        Translate geometry and UI properties (Blender and POV native) to the POV file
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    
    Along these essential files also coexist a few additional libraries to help make
    
    Blender stand up to other POV IDEs such as povwin or QTPOV
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        presets :
            Material (sss)
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                apple.py ; chicken.py ; cream.py ; Ketchup.py ; marble.py ;
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                potato.py ; skim_milk.py ; skin1.py ; skin2.py ; whole_milk.py
            Radiosity
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                01_Debug.py ; 02_Fast.py ; 03_Normal.py ; 04_Two_Bounces.py ;
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                05_Final.py ; 06_Outdoor_Low_Quality.py ; 07_Outdoor_High_Quality.py ;
                08_Outdoor(Sun)Light.py ; 09_Indoor_Low_Quality.py ;
                10_Indoor_High_Quality.py ;
            World
                01_Clear_Blue_Sky.py ; 02_Partly_Hazy_Sky.py ; 03_Overcast_Sky.py ;
                04_Cartoony_Sky.py ; 05_Under_Water.py ;
            Light
    
                01_(4800K)_Direct_Sun.py ;
                02_(5400K)_High_Noon_Sun.py ;
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                03_(6000K)_Daylight_Window.py ;
                04_(6000K)_2500W_HMI_(Halogen_Metal_Iodide).py ;
    
                05_(4000K)_100W_Metal_Halide.py ;
                06_(3200K)_100W_Quartz_Halogen.py ;
                07_(2850K)_100w_Tungsten.py ;
                08_(2600K)_40w_Tungsten.py ;
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                09_(5000K)_75W_Full_Spectrum_Fluorescent_T12.py ;
                10_(4300K)_40W_Vintage_Fluorescent_T12.py ;
                11_(5000K)_18W_Standard_Fluorescent_T8 ;
                12_(4200K)_18W_Cool_White_Fluorescent_T8.py ;
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                13_(3000K)_18W_Warm_Fluorescent_T8.py ;
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                14_(6500K)_54W_Grow_Light_Fluorescent_T5-HO.py ;
                15_(3200K)_40W_Induction_Fluorescent.py ;
                16_(2100K)_150W_High_Pressure_Sodium.py ;
                17_(1700K)_135W_Low_Pressure_Sodium.py ;
    
                18_(6800K)_175W_Mercury_Vapor.py ;
                19_(5200K)_700W_Carbon_Arc.py ;
                20_(6500K)_15W_LED_Spot.py ;
                21_(2700K)_7W_OLED_Panel.py ;
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                22_(30000K)_40W_Black_Light_Fluorescent.py ;
    
                23_(30000K)_40W_Black_Light_Bulb.py;
                24_(1850K)_Candle.py
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        templates:
            abyss.pov ; biscuit.pov ; bsp_Tango.pov ; chess2.pov ;
            cornell.pov ; diffract.pov ; diffuse_back.pov ; float5 ;
            gamma_showcase.pov ; grenadine.pov ; isocacti.pov ;
            mediasky.pov ; patio-radio.pov ; subsurface.pov ; wallstucco.pov
    """
    
    
    
        "name": "Persistence of Vision",
        "author": "Campbell Barton, "
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        "Maurice Raybaud, "
        "Leonid Desyatkov, "
        "Bastien Montagne, "
        "Constantin Rahn, "
        "Silvio Falcinelli",
    
        "version": (0, 1, 1),
    
        "blender": (2, 81, 0),
    
        "location": "Render Properties > Render Engine > Persistence of Vision",
        "description": "Persistence of Vision integration for blender",
    
        "doc_url": "{BLENDER_MANUAL_URL}/addons/render/povray.html",
    
        "warning": "Under active development, seeking co-maintainer(s)",
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    if "bpy" in locals():
    
        importlib.reload(ui)
    
        importlib.reload(nodes)
    
        importlib.reload(render)
    
        importlib.reload(shading)
    
        importlib.reload(primitives)
    
        importlib.reload(update_files)
    
        from bpy.utils import register_class, unregister_class
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        # import addon_utils  # To use some other addons
        import nodeitems_utils  # for Nodes
        from nodeitems_utils import NodeCategory, NodeItem  # for Nodes
    
        from bl_operators.presets import AddPresetBase
    
        from bpy.types import (
            AddonPreferences,
            PropertyGroup,
            NodeSocket,
        )
    
    
        from bpy.props import (
    
            FloatVectorProperty,
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            StringProperty,
            BoolProperty,
            IntProperty,
            FloatProperty,
            EnumProperty,
            PointerProperty,
            CollectionProperty,
        )
        from . import ui, render, update_files
    
    
    def string_strip_hyphen(name):
    
        """Remove hyphen characters from a string to avoid POV errors"""
    
        return name.replace("-", "")
    
    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.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 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]
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    
    def active_texture_name_from_uilist(self, context):
    
    
        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
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    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
    
    ###############################################################################
    # Scene POV properties.
    ###############################################################################
    
    class RenderPovSettingsScene(PropertyGroup):
    
        """Declare scene level properties controllable in UI and translated to POV"""
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    
        # Linux SDL-window enable
    
        sdl_window_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable SDL window",
            description="Enable the SDL window in Linux OS",
            default=True,
        )
    
        # File Options
    
        text_block: StringProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Text Scene Name",
            description="Name of POV scene to use. "
            "Set when clicking Run to render current text only",
            maxlen=1024,
        )
    
        tempfiles_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable Tempfiles",
            description="Enable the OS-Tempfiles. Otherwise set the path where"
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            " to save the files",
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            default=True,
        )
    
        pov_editor: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="POV editor",
            description="Don't Close POV editor after rendering (Overridden"
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            " by /EXIT command)",
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            default=False,
        )
    
        deletefiles_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Delete files",
            description="Delete files after rendering. "
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            "Doesn't work with the image",
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            default=True,
        )
    
        scene_name: StringProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Scene Name",
            description="Name of POV scene to create. Empty name will use "
            "the name of the blend file",
            maxlen=1024,
        )
    
        scene_path: StringProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Export scene path",
            # Bug in POV-Ray RC3
            # description="Path to directory where the exported scene "
            # "(POV and INI) is created",
            description="Path to directory where the files are created",
            maxlen=1024,
            subtype="DIR_PATH",
        )
    
        renderimage_path: StringProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Rendered image path",
            description="Full path to directory where the rendered image is "
            "saved",
            maxlen=1024,
            subtype="DIR_PATH",
        )
    
        list_lf_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="LF in lists",
            description="Enable line breaks in lists (vectors and indices). "
            "Disabled: lists are exported in one line",
            default=True,
        )
    
        # Not a real pov option, just to know if we should write
    
        radio_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable Radiosity",
            description="Enable POV radiosity calculation",
            default=True,
        )
    
        radio_display_advanced: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Advanced Options",
            description="Show advanced options",
            default=False,
        )
    
        media_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable Media",
            description="Enable POV atmospheric media",
            default=False,
        )
    
        media_samples: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Samples",
            description="Number of samples taken from camera to first object "
            "encountered along ray path for media calculation",
            min=1,
            max=100,
            default=35,
        )
    
        media_scattering_type: EnumProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Scattering Type",
            description="Scattering model",
            items=(
                (
                    '1',
                    "1 Isotropic",
                    "The simplest form of scattering because"
                    " it is independent of direction."
                ),
                (
                    '2',
                    "2 Mie haze ",
                    "For relatively small particles such as "
                    "minuscule water droplets of fog, cloud "
                    "particles, and particles responsible "
                    "for the polluted sky. In this model the"
                    " scattering is extremely directional in"
                    " the forward direction i.e. the amount "
                    "of scattered light is largest when the "
                    "incident light is anti-parallel to the "
                    "viewing direction (the light goes "
                    "directly to the viewer). It is smallest"
                    " when the incident light is parallel to"
                    " the viewing direction. "
                ),
                (
                    '3',
                    "3 Mie murky",
                    "Like haze but much more directional"
                ),
                (
                    '4',
                    "4 Rayleigh",
                    "For extremely small particles such as "
                    "molecules of the air. The amount of "
                    "scattered light depends on the incident"
                    " light angle. It is largest when the "
                    "incident light is parallel or "
                    "anti-parallel to the viewing direction "
                    "and smallest when the incident light is "
                    "perpendicular to viewing direction."
                ),
                (
                    '5',
                    "5 Henyey-Greenstein",
                    "The default eccentricity value "
                    "of zero defines isotropic "
                    "scattering while positive "
                    "values lead to scattering in "
                    "the direction of the light and "
                    "negative values lead to "
                    "scattering in the opposite "
                    "direction of the light. Larger "
                    "values of e (or smaller values "
                    "in the negative case) increase "
                    "the directional property of the"
                    " scattering."
                )
            ),
            default='1',
        )
    
        media_diffusion_scale: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Scale",
            description="Scale factor of Media Diffusion Color",
    
            precision=6, step=0.00000001, min=0.000000001, max=1.0,
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            default=(1.0),
        )
    
        media_diffusion_color: FloatVectorProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Media Diffusion Color",
            description="The atmospheric media color",
            precision=4, step=0.01, min=0, soft_max=1,
            default=(0.001, 0.001, 0.001),
            options={'ANIMATABLE'},
            subtype='COLOR',
        )
    
        media_absorption_scale: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Scale",
            description="Scale factor of Media Absorption Color. "
            "use 1/depth of media volume in meters",
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            step=0.000001,
            min=0.000000001,
            max=1.0,
            default=(0.00002),
        )
    
        media_absorption_color: FloatVectorProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Media Absorption Color",
            description="The atmospheric media absorption color",
            precision=4, step=0.01, min=0, soft_max=1,
            default=(0.0, 0.0, 0.0),
            options={'ANIMATABLE'},
            subtype='COLOR',
        )
    
        media_eccentricity: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Media Eccenticity Factor",
            description="Positive values lead"
            " to scattering in the direction of the light and negative "
            "values lead to scattering in the opposite direction of the "
            "light. Larger values of e (or smaller values in the negative"
    
            " case) increase the directional property of the scattering",
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            precision=2,
            step=0.01,
            min=-1.0,
            max=1.0,
            default=(0.0),
            options={'ANIMATABLE'},
        )
    
        baking_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable Baking",
            description="Enable POV texture baking",
            default=False
        )
    
    
        indentation_character: EnumProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Indentation",
            description="Select the indentation type",
            items=(
                ('NONE', "None", "No indentation"),
                ('TAB', "Tabs", "Indentation with tabs"),
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                ('SPACE', "Spaces", "Indentation with spaces")
            ),
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            default='SPACE'
        )
    
    
        indentation_spaces: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Quantity of spaces",
            description="The number of spaces for indentation",
            min=1,
            max=10,
            default=4,
        )
    
        comments_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable Comments",
            description="Add comments to pov file",
            default=True,
        )
    
    
        # Real pov options
    
        command_line_switches: StringProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Command Line Switches",
            description="Command line switches consist of a + (plus) or - "
            "(minus) sign, followed by one or more alphabetic "
            "characters and possibly a numeric value",
            maxlen=500,
        )
    
        antialias_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Anti-Alias", description="Enable Anti-Aliasing",
            default=True,
        )
    
        antialias_method: EnumProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Method",
            description="AA-sampling method. Type 1 is an adaptive, "
            "non-recursive, super-sampling method. Type 2 is an "
            "adaptive and recursive super-sampling method. Type 3 "
            "is a stochastic halton based super-sampling method",
            items=(
                ("0", "non-recursive AA", "Type 1 Sampling in POV"),
                ("1", "recursive AA", "Type 2 Sampling in POV"),
                ("2", "stochastic AA", "Type 3 Sampling in POV")
            ),
            default="1",
        )
    
        antialias_confidence: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Antialias Confidence",
            description="how surely the computed color "
            "of a given pixel is indeed"
            "within the threshold error margin",
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            min=0.0001,
            max=1.0000,
            default=0.9900,
            precision=4
    
        antialias_depth: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Antialias Depth",
            description="Depth of pixel for sampling",
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            min=1,
            max=9,
            default=3
    
        antialias_threshold: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Antialias Threshold",
            description="Tolerance for sub-pixels",
            min=0.0,
            max=1.0,
            soft_min=0.05,
            soft_max=0.5,
            default=0.03,
        )
    
        jitter_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Jitter",
            description="Enable Jittering. Adds noise into the sampling "
            "process (it should be avoided to use jitter in "
            "animation)",
            default=False,
        )
    
        jitter_amount: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Jitter Amount",
            description="Amount of jittering",
            min=0.0,
            max=1.0,
            soft_min=0.01,
            soft_max=1.0,
            default=1.0,
        )
    
        antialias_gamma: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Antialias Gamma",
            description="POV-Ray compares gamma-adjusted values for super "
            "sampling. Antialias Gamma sets the Gamma before "
            "comparison",
            min=0.0,
            max=5.0,
            soft_min=0.01,
            soft_max=2.5,
            default=2.5,
        )
    
        alpha_mode: EnumProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Alpha",
            description="Representation of alpha information in the RGBA pixels",
            items=(
                ("SKY", "Sky", "Transparent pixels are filled with sky color"),
                (
                "TRANSPARENT",
                "Transparent",
                "Transparent, World background is transparent with premultiplied alpha",
                ),
            ),
            default="SKY",
        )
    
    
        use_shadows: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Shadows",
            description="Calculate shadows while rendering",
            default=True,
        )
    
        max_trace_level: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Max Trace Level",
            description="Number of reflections/refractions allowed on ray "
            "path",
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            min=1,
            max=256,
            default=5
    
        adc_bailout_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable",
            description="",
            default=False,
        )
    
        adc_bailout: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="ADC Bailout",
            description="Adaptive Depth Control (ADC) to stop computing additional"
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                "reflected or refracted rays when their contribution is insignificant."
                "The default value is 1/255, or approximately 0.0039, since a change "
                "smaller than that could not be visible in a 24 bit image. Generally "
                "this value is fine and should be left alone."
                "Setting adc_bailout to 0 will disable ADC, relying completely on "
                "max_trace_level to set an upper limit on the number of rays spawned. ",
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            min=0.0,
            max=1000.0,
            default=0.00392156862745,
            precision=3
        )
    
        ambient_light_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable",
            description="",
            default=False,
        )
    
        ambient_light: FloatVectorProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Ambient Light",
            description="Ambient light is used to simulate the effect of inter-diffuse reflection",
            precision=4, step=0.01, min=0, soft_max=1,
            default=(1, 1, 1), options={'ANIMATABLE'}, subtype='COLOR',
    
        global_settings_advanced: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Advanced",
            description="",
            default=False,
        )
    
        irid_wavelength_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable",
            description="",
            default=False,
        )
    
        irid_wavelength: FloatVectorProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Irid Wavelength",
            description=(
                "Iridescence calculations depend upon the dominant "
                "wavelengths of the primary colors of red, green and blue light"
            ),
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            precision=4,
            step=0.01,
            min=0,
            soft_max=1,
            default=(0.25,0.18,0.14),
            options={'ANIMATABLE'},
            subtype='COLOR'
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        # Deprecated (autodetected in pov3.8):
        # charset: EnumProperty(
            # name="Charset",
            # description="This allows you to specify the assumed character set of all text strings",
            # items=(
                # ("ascii", "ASCII", ""),
                # ("utf8", "UTF-8", ""),
                # ("sys", "SYS", "")
            # ),
            # default="utf8",
        # )
    
        max_intersections_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable",
            description="",
            default=False,
        )
    
        max_intersections: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Max Intersections",
            description="POV-Ray uses a set of internal stacks to collect ray/object intersection points",
            min=2,
            max=1024,
            default=64,
        )
    
        number_of_waves_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable",
            description="",
            default=False,
        )
    
        number_of_waves: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Number Waves",
            description=(
                "The waves and ripples patterns are generated by summing a series of waves, "
                "each with a slightly different center and size"
            ),
            min=1,
            max=10,
            default=1000,
        )
    
        noise_generator_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Enable",
            description="",
            default=False,
        )
    
        noise_generator: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Noise Generator",
            description="There are three noise generators implemented",
            min=1,
            max=3,
            default=2,
        )
    
        ########################### PHOTONS #######################################
    
        photon_enable: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Photons",
            description="Enable global photons",
            default=False,
        )
    
        photon_enable_count: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Spacing / Count",
            description="Enable count photons",
            default=False,
        )
    
        photon_count: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Count",
            description="Photons count",
            min=1,
            max=100000000,
            default=20000
        )
    
        photon_spacing: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Spacing",
            description="Average distance between photons on surfaces. half "
            "this get four times as many surface photons",
            min=0.001,
            max=1.000,
            soft_min=0.001,
            soft_max=1.000,
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            precision=3,
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            default=0.005,
        )
    
        photon_max_trace_level: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Max Trace Level",
            description="Number of reflections/refractions allowed on ray "
            "path",
            min=1,
            max=256,
            default=5
        )
    
        photon_adc_bailout: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="ADC Bailout",
            description="The adc_bailout for photons. Use adc_bailout = "
            "0.01 / brightest_ambient_object for good results",
            min=0.0,
            max=1000.0,
            soft_min=0.0,
            soft_max=1.0,
            precision=3,
            default=0.1,
        )
    
        photon_gather_min: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Gather Min", description="Minimum number of photons gathered"
            "for each point",
            min=1, max=256, default=20
        )
    
        photon_gather_max: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Gather Max", description="Maximum number of photons gathered for each point",
            min=1, max=256, default=100
        )
    
        photon_map_file_save_load: EnumProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Operation",
            description="Load or Save photon map file",
            items=(
                ("NONE", "None", ""),
                ("save", "Save", ""),
                ("load", "Load", "")
            ),
            default="NONE",
        )
    
        photon_map_filename: StringProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Filename",
            description="",
            maxlen=1024
        )
    
        photon_map_dir: StringProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Directory",
            description="",
            maxlen=1024,
            subtype="DIR_PATH",
        )
    
        photon_map_file: StringProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="File",
            description="",
            maxlen=1024,
            subtype="FILE_PATH"
        )
    
        #########RADIOSITY########
    
        radio_adc_bailout: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="ADC Bailout",
            description="The adc_bailout for radiosity rays. Use "
            "adc_bailout = 0.01 / brightest_ambient_object for good results",
            min=0.0,
            max=1000.0,
            soft_min=0.0,
            soft_max=1.0,
            default=0.0039,
            precision=4,
        )
    
        radio_always_sample: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Always Sample",
            description="Only use the data from the pretrace step and not gather "
            "any new samples during the final radiosity pass",
            default=False,
        )
    
        radio_brightness: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Brightness",
            description="Amount objects are brightened before being returned "
            "upwards to the rest of the system",
            min=0.0, max=1000.0, soft_min=0.0, soft_max=10.0, default=1.0
        )
    
        radio_count: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Ray Count",
            description="Number of rays for each new radiosity value to be calculated "
            "(halton sequence over 1600)",
            min=1, max=10000, soft_max=1600, default=35
        )
    
        radio_error_bound: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Error Bound",
            description="One of the two main speed/quality tuning values, "
            "lower values are more accurate",
    
            min=0.0, max=1000.0, soft_min=0.1, soft_max=10.0, default=10.0
    
        radio_gray_threshold: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Gray Threshold",
            description="One of the two main speed/quality tuning values, "
            "lower values are more accurate",
            min=0.0, max=1.0, soft_min=0, soft_max=1, default=0.0
        )
    
        radio_low_error_factor: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Low Error Factor",
            description="Just enough samples is slightly blotchy. Low error changes error "
            "tolerance for less critical last refining pass",
            min=0.000001, max=1.0, soft_min=0.000001, soft_max=1.0, default=0.5
        )
    
        radio_media: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Media",
            description="Radiosity estimation can be affected by media",
            default=True,
        )
    
        radio_subsurface: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Subsurface",
            description="Radiosity estimation can be affected by Subsurface Light Transport",
            default=False,
        )
    
        radio_minimum_reuse: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Minimum Reuse",
            description="Fraction of the screen width which sets the minimum radius of reuse "
            "for each sample point (At values higher than 2% expect errors)",
            min=0.0, max=1.0, soft_min=0.1, soft_max=0.1, default=0.015, precision=3
        )
    
        radio_maximum_reuse: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Maximum Reuse",
            description="The maximum reuse parameter works in conjunction with, and is similar to that of minimum reuse, "
            "the only difference being that it is an upper bound rather than a lower one",
            min=0.0, max=1.0,default=0.2, precision=3
        )
    
        radio_nearest_count: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Nearest Count",
            description="Number of old ambient values blended together to "
            "create a new interpolated value",
            min=1, max=20, default=1
        )
    
        radio_normal: BoolProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Normals",
            description="Radiosity estimation can be affected by normals",
            default=False,
        )
    
        radio_recursion_limit: IntProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Recursion Limit",
            description="how many recursion levels are used to calculate "
            "the diffuse inter-reflection",
            min=1, max=20, default=1
        )
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
        radio_pretrace_start: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Pretrace Start",
            description="Fraction of the screen width which sets the size of the "
            "blocks in the mosaic preview first pass",
    
            min=0.005, max=1.00, soft_min=0.02, soft_max=1.0, default=0.04
    
        # XXX TODO set automatically to  pretrace_end = 8 / max (image_width, image_height)
        # for non advanced mode
    
        radio_pretrace_end: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Pretrace End",
            description="Fraction of the screen width which sets the size of the blocks "
            "in the mosaic preview last pass",
    
            min=0.000925, max=1.00, soft_min=0.01, soft_max=1.00, default=0.004, precision=3
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    
    
    ###############################################################################
    # Material POV properties.
    ###############################################################################
    
    class MaterialTextureSlot(PropertyGroup):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Declare material texture slot level properties for UI and translated to POV."""
    
        bl_idname="pov_texture_slots",
    
        bl_description="Texture_slots from Blender-2.79",
    
        # Adding a "real" texture datablock as property is not possible
        # (or at least not easy through a dynamically populated EnumProperty).
        # That's why we'll use a prop_search() UILayout function in ui.py.
        # So we'll assign the name of the needed texture datablock to the below StringProperty.
    
        texture : StringProperty(update=active_texture_name_from_uilist)
    
        # and use another temporary StringProperty to change the linked data
        texture_search : StringProperty(
            name="",
            update = active_texture_name_from_search,
            description = "Browse Texture to be linked",
        )
    
    
        alpha_factor: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="Alpha",
            description="Amount texture affects alpha",
    
    
        ambient_factor: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="",
            description="Amount texture affects ambient",
    
    
        bump_method: EnumProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="",
            description="Method to use for bump mapping",
            items=(
                ("BUMP_ORIGINAL", "Bump Original", ""),
                ("BUMP_COMPATIBLE", "Bump Compatible", ""),
                ("BUMP_DEFAULT", "Bump Default", ""),
                ("BUMP_BEST_QUALITY", "Bump Best Quality", "")
            ),
            default="BUMP_ORIGINAL",
        )
    
    
        bump_objectspace: EnumProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="",
            description="Space to apply bump mapping in",
            items=(
                ("BUMP_VIEWSPACE", "Bump Viewspace", ""),
                ("BUMP_OBJECTSPACE", "Bump Objectspace", ""),
                ("BUMP_TEXTURESPACE", "Bump Texturespace", "")
            ),
            default="BUMP_VIEWSPACE",
        )
    
    
        density_factor: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="",
            description="Amount texture affects density",
    
    
        diffuse_color_factor: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="",
            description="Amount texture affects diffuse color",
    
    
        diffuse_factor: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="",
            description="Amount texture affects diffuse reflectivity",
    
    
        displacement_factor: FloatProperty(
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            name="",
            description="Amount texture displaces the surface",
    
    
        emission_color_factor: FloatProperty(