Skip to content
Snippets Groups Projects
ui.py 131 KiB
Newer Older
  • Learn to ignore specific revisions
  •         else:
                self.layout.prop(scene.pov, "tempfiles_enable", text="", icon='CONSOLE')
    
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        def draw(self, context):
            layout = self.layout
    
    
            scene = context.scene
    
            split = layout.split()
    
            col = split.column()
            col.label(text="Command line switches:")
    
            col.prop(scene.pov, "command_line_switches", text="")
    
            split = layout.split()
    
    
            layout.active = not scene.pov.tempfiles_enable
            #if not scene.pov.tempfiles_enable:
            split.prop(scene.pov, "deletefiles_enable", text="Delete files")
    
            split.prop(scene.pov, "pov_editor", text="POV Editor")
    
            col = layout.column()
            col.prop(scene.pov, "scene_name", text="Name")
            col.prop(scene.pov, "scene_path", text="Path to files")
            #col.prop(scene.pov, "scene_path", text="Path to POV-file")
            #col.prop(scene.pov, "renderimage_path", text="Path to image")
    
            split = layout.split()
            split.prop(scene.pov, "indentation_character", text="Indent")
            if scene.pov.indentation_character == 'SPACE':
                split.prop(scene.pov, "indentation_spaces", text="Spaces")
    
            row = layout.row()
            row.prop(scene.pov, "comments_enable", text="Comments")
            row.prop(scene.pov, "list_lf_enable", text="Line breaks in lists")
    
    class RENDER_PT_POV_render_settings(RenderButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov render settings buttons."""
    
    
        bl_label = "Global Settings"
    
        bl_options = {'DEFAULT_CLOSED'}
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
    
        def draw_header(self, context):
    
            scene = context.scene
            if scene.pov.global_settings_advanced:
                self.layout.prop(scene.pov, "global_settings_advanced", text="", icon='SETTINGS')
    
            else:
                self.layout.prop(scene.pov, "global_settings_advanced", text="", icon='PREFERENCES')
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        def draw(self, context):
            layout = self.layout
    
            scene = context.scene
    
            rd = context.scene.render
    
            #layout.active = (scene.pov.max_trace_level != 0)
    
            if sys.platform[:3] != "win":
                layout.prop(scene.pov, "sdl_window_enable", text="POV-Ray SDL Window")
    
    Thomas Dinges's avatar
    Thomas Dinges committed
            col = layout.column()
    
            col.label(text="Main Path Tracing:")
    
            col.prop(scene.pov, "max_trace_level", text="Ray Depth")
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            align = True
    
            layout.active = scene.pov.global_settings_advanced
            layout.prop(scene.pov,"charset")
            row = layout.row(align = align)
            row.prop(scene.pov,"adc_bailout")
            row = layout.row(align = align)
            row.prop(scene.pov,"ambient_light")
            row = layout.row(align = align)
            row.prop(scene.pov,"irid_wavelength")
    
            row = layout.row(align = align)
    
            row.prop(scene.pov,"max_intersections")
    
            row = layout.row(align = align)
    
            row.prop(scene.pov,"number_of_waves")
            row = layout.row(align = align)
            row.prop(scene.pov,"noise_generator")
    
            split = layout.split()
            split.label(text="Shading:")
            split = layout.split()
    
            row = split.row(align = align)
            row.prop(scene.pov, "use_shadows")
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            row.prop(scene.pov, "alpha_mode")
    
    
    class RENDER_PT_POV_photons(RenderButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov photons buttons."""
    
    
        bl_options = {'DEFAULT_CLOSED'}
    
        # def draw_header(self, context):
            # self.layout.label(icon='SETTINGS')
    
        def draw_header(self, context):
            scene = context.scene
            if scene.pov.photon_enable:
                self.layout.prop(scene.pov, "photon_enable", text="", icon='PMARKER_ACT')
            else:
                self.layout.prop(scene.pov, "photon_enable", text="", icon='PMARKER')
        def draw(self, context):
            scene = context.scene
            layout = self.layout
    
            layout.active = scene.pov.photon_enable
            col = layout.column()
            #col.label(text="Global Photons:")
            col.prop(scene.pov, "photon_max_trace_level", text="Photon Depth")
    
            col = split.column()
            col.prop(scene.pov, "photon_spacing", text="Spacing")
            col.prop(scene.pov, "photon_gather_min")
    
            col = split.column()
            col.prop(scene.pov, "photon_adc_bailout", text="Photon ADC")
            col.prop(scene.pov, "photon_gather_max")
    
            box.label(text='Photon Map File:')
    
            row = box.row()
            row.prop(scene.pov, "photon_map_file_save_load",expand = True)
            if scene.pov.photon_map_file_save_load in {'save'}:
                box.prop(scene.pov, "photon_map_dir")
                box.prop(scene.pov, "photon_map_filename")
            if scene.pov.photon_map_file_save_load in {'load'}:
                box.prop(scene.pov, "photon_map_file")
            #end main photons
    
    class RENDER_PT_POV_antialias(RenderButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov antialiasing buttons."""
    
    
        bl_label = "Anti-Aliasing"
    
        bl_options = {'DEFAULT_CLOSED'}
    
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
    
        def draw_header(self, context):
    
            prefs = bpy.context.preferences.addons[__package__].preferences
    
            scene = context.scene
    
            if prefs.branch_feature_set_povray != 'uberpov' and scene.pov.antialias_method == '2':
    
                self.layout.prop(scene.pov, "antialias_enable", text="", icon='ERROR')
            elif scene.pov.antialias_enable:
    
                self.layout.prop(scene.pov, "antialias_enable", text="", icon='ANTIALIASED')
            else:
                self.layout.prop(scene.pov, "antialias_enable", text="", icon='ALIASED')
    
    
        def draw(self, context):
    
            prefs = bpy.context.preferences.addons[__package__].preferences
    
            layout = self.layout
            scene = context.scene
    
    Thomas Dinges's avatar
    Thomas Dinges committed
            row = layout.row()
    
            row.prop(scene.pov, "antialias_method", text="")
    
            if prefs.branch_feature_set_povray != 'uberpov' and scene.pov.antialias_method == '2':
    
                col = layout.column()
                col.alignment = 'CENTER'
                col.label(text="Stochastic Anti Aliasing is")
                col.label(text="Only Available with UberPOV")
                col.label(text="Feature Set in User Preferences.")
    
                col.label(text="Using Type 2 (recursive) instead")
    
                row.prop(scene.pov, "jitter_enable", text="Jitter")
    
                split = layout.split()
                col = split.column()
                col.prop(scene.pov, "antialias_depth", text="AA Depth")
                sub = split.column()
                sub.prop(scene.pov, "jitter_amount", text="Jitter Amount")
                if scene.pov.jitter_enable:
                    sub.enabled = True
                else:
                    sub.enabled = False
    
                row = layout.row()
                row.prop(scene.pov, "antialias_threshold", text="AA Threshold")
                row.prop(scene.pov, "antialias_gamma", text="AA Gamma")
    
                if prefs.branch_feature_set_povray == 'uberpov':
    
                    row = layout.row()
                    row.prop(scene.pov, "antialias_confidence", text="AA Confidence")
    
                    if scene.pov.antialias_method == '2':
    
                        row.enabled = True
                    else:
                        row.enabled = False
    
    class RENDER_PT_POV_radiosity(RenderButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov radiosity buttons."""
    
    
        bl_label = "Diffuse Radiosity"
    
        bl_options = {'DEFAULT_CLOSED'}
    
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
    Luca Bonavita's avatar
    Luca Bonavita committed
        def draw_header(self, context):
            scene = context.scene
    
            if scene.pov.radio_enable:
    
                self.layout.prop(scene.pov, "radio_enable", text="", icon='OUTLINER_OB_LIGHTPROBE')
    
                self.layout.prop(scene.pov, "radio_enable", text="", icon='LIGHTPROBE_CUBEMAP')
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
        def draw(self, context):
            layout = self.layout
    
            scene = context.scene
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
            split = layout.split()
    
            col = split.column()
    
            col.prop(scene.pov, "radio_count", text="Rays")
            col.prop(scene.pov, "radio_recursion_limit", text="Recursions")
    
            split.prop(scene.pov, "radio_error_bound", text="Error Bound")
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
            layout.prop(scene.pov, "radio_display_advanced")
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                split = layout.split()
    
                col = split.column()
    
                col.prop(scene.pov, "radio_adc_bailout", slider=True)
    
                col.prop(scene.pov, "radio_minimum_reuse", text="Min Reuse")
    
                col.prop(scene.pov, "radio_gray_threshold", slider=True)
                col.prop(scene.pov, "radio_pretrace_start", slider=True)
    
                col.prop(scene.pov, "radio_low_error_factor", slider=True)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                col = split.column()
    
                col.prop(scene.pov, "radio_maximum_reuse", text="Max Reuse")
    
                col.prop(scene.pov, "radio_nearest_count")
                col.prop(scene.pov, "radio_pretrace_end", slider=True)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                col.label(text="Estimation Influence:")
    
                col.prop(scene.pov, "radio_always_sample")
    
                col.prop(scene.pov, "radio_media")
                col.prop(scene.pov, "radio_subsurface")
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    class POV_RADIOSITY_MT_presets(bpy.types.Menu):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov radiosity presets menu."""
    
    
        bl_label = "Radiosity Presets"
        preset_subdir = "pov/radiosity"
        preset_operator = "script.execute_preset"
        draw = bpy.types.Menu.draw_preset
    
    
    
    class RENDER_OT_POV_radiosity_add_preset(AddPresetBase, Operator):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov radiosity add presets button."""
    
    
        '''Add a Radiosity Preset'''
        bl_idname = "scene.radiosity_preset_add"
        bl_label = "Add Radiosity Preset"
        preset_menu = "POV_RADIOSITY_MT_presets"
    
        # variable used for all preset values
        preset_defines = [
            "scene = bpy.context.scene"
            ]
    
        # properties to store in the preset
        preset_values = [
    
            "scene.pov.radio_display_advanced",
    
            "scene.pov.radio_adc_bailout",
            "scene.pov.radio_always_sample",
            "scene.pov.radio_brightness",
            "scene.pov.radio_count",
            "scene.pov.radio_error_bound",
            "scene.pov.radio_gray_threshold",
            "scene.pov.radio_low_error_factor",
            "scene.pov.radio_media",
            "scene.pov.radio_subsurface",
            "scene.pov.radio_minimum_reuse",
            "scene.pov.radio_maximum_reuse",
            "scene.pov.radio_nearest_count",
            "scene.pov.radio_normal",
            "scene.pov.radio_recursion_limit",
            "scene.pov.radio_pretrace_start",
    
            "scene.pov.radio_pretrace_end",
    
            ]
    
        # where to store the preset
        preset_subdir = "pov/radiosity"
    
    
    
    
    
    # Draw into an existing panel
    def rad_panel_func(self, context):
        layout = self.layout
    
        row = layout.row(align=True)
        row.menu(POV_RADIOSITY_MT_presets.__name__, text=POV_RADIOSITY_MT_presets.bl_label)
    
        row.operator(RENDER_OT_POV_radiosity_add_preset.bl_idname, text="", icon='ADD')
        row.operator(RENDER_OT_POV_radiosity_add_preset.bl_idname, text="", icon='REMOVE').remove_active = True
    
    class RENDER_PT_POV_media(WorldButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define a pov global atmospheric media buttons."""
    
    
        bl_label = "Atmosphere Media"
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        def draw_header(self, context):
            scene = context.scene
    
    
            self.layout.prop(scene.pov, "media_enable", text="")
    
    
        def draw(self, context):
            layout = self.layout
    
            scene = context.scene
    
    
            col = layout.column()
            col.prop(scene.pov, "media_scattering_type", text="")
            col = layout.column()
            col.prop(scene.pov, "media_samples", text="Samples")
    
            split = layout.split()
    
            col = split.column(align=True)
            col.label(text="Scattering:")
            col.prop(scene.pov, "media_diffusion_scale")
            col.prop(scene.pov, "media_diffusion_color", text="")
            col = split.column(align=True)
            col.label(text="Absorption:")
    
            col.prop(scene.pov, "media_absorption_scale")
    
            col.prop(scene.pov, "media_absorption_color", text="")
            if scene.pov.media_scattering_type == '5':
                col = layout.column()
                col.prop(scene.pov, "media_eccentricity", text="Eccentricity")
    
    ##class RENDER_PT_povray_baking(RenderButtonsPanel, Panel):
    
    ##    bl_label = "Baking"
    ##    COMPAT_ENGINES = {'POVRAY_RENDER'}
    ##
    ##    def draw_header(self, context):
    ##        scene = context.scene
    ##
    
    ##        self.layout.prop(scene.pov, "baking_enable", text="")
    
    ##
    ##    def draw(self, context):
    ##        layout = self.layout
    ##
    ##        scene = context.scene
    ##        rd = scene.render
    ##
    
    class MODIFIERS_PT_POV_modifiers(ModifierButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov modifier buttons. (For booleans)"""
    
    
        bl_label = "POV-Ray"
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        #def draw_header(self, context):
            #scene = context.scene
            #self.layout.prop(scene.pov, "boolean_mod", text="")
    
        def draw(self, context):
            scene = context.scene
            layout = self.layout
            ob = context.object
            mod = ob.modifiers
            col = layout.column()
            # Find Boolean Modifiers for displaying CSG option
            onceCSG = 0
            for mod in ob.modifiers:
                if onceCSG == 0:
                    if mod :
                        if mod.type == 'BOOLEAN':
                            col.prop(ob.pov, "boolean_mod")
                            onceCSG = 1
    
    
                        if ob.pov.boolean_mod == "POV":
    
                            split = layout.split()
                            col = layout.column()
                            # Inside Vector for CSG
                            col.prop(ob.pov, "inside_vector")
    
    class MATERIAL_MT_POV_sss_presets(bpy.types.Menu):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov sss preset menu."""
    
    
        bl_label = "SSS Presets"
        preset_subdir = "pov/material/sss"
        preset_operator = "script.execute_preset"
        draw = bpy.types.Menu.draw_preset
    
    
    class MATERIAL_OT_POV_sss_add_preset(AddPresetBase, Operator):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Add an SSS Preset"""
    
        bl_idname = "material.sss_preset_add"
        bl_label = "Add SSS Preset"
        preset_menu = "MATERIAL_MT_POV_sss_presets"
    
        # variable used for all preset values
        preset_defines = [
            "material = bpy.context.material"
            ]
    
        # properties to store in the preset
        preset_values = [
            "material.pov_subsurface_scattering.radius",
            "material.pov_subsurface_scattering.color",
            ]
    
        # where to store the preset
        preset_subdir = "pov/material/sss"
    
    
    class MATERIAL_PT_POV_sss(MaterialButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov sss buttons panel."""
    
    
        bl_label = "Subsurface Scattering"
        bl_options = {'DEFAULT_CLOSED'}
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        @classmethod
        def poll(cls, context):
            mat = context.material
            engine = context.scene.render.engine
            return check_material(mat) and (mat.pov.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
    
        def draw_header(self, context):
            mat = context.material #FORMERLY : #active_node_mat(context.material)
            sss = mat.pov_subsurface_scattering
    
            self.layout.active = (not mat.pov.use_shadeless)
            self.layout.prop(sss, "use", text="")
    
        def draw(self, context):
            layout = self.layout
    
            mat = context.material #FORMERLY : #active_node_mat(context.material)
    
            sss = mat.pov_subsurface_scattering
    
            layout.active = (sss.use) and (not mat.pov.use_shadeless)
    
            row = layout.row().split()
    
            sub = row.row(align=True).split(align=True, factor=0.75)
    
            sub.menu(MATERIAL_MT_POV_sss_presets.__name__, text=MATERIAL_MT_POV_sss_presets.bl_label)
    
            sub.operator(MATERIAL_OT_POV_sss_add_preset.bl_idname, text="", icon='ADD')
            sub.operator(MATERIAL_OT_POV_sss_add_preset.bl_idname, text="", icon='REMOVE').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_POV_activate_node(MaterialButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define an activate pov nodes button."""
    
    
        bl_label = "Activate Node Settings"
        bl_context = "material"
        bl_options = {'HIDE_HEADER'}
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        @classmethod
        def poll(cls, context):
            engine = context.scene.render.engine
            mat=context.material
            ob = context.object
    
            return mat and mat.pov.type == "SURFACE" and (engine in cls.COMPAT_ENGINES) and not (mat.pov.material_use_nodes or mat.use_nodes)
    
        def draw(self, context):
            layout = self.layout
            # layout.operator("pov.material_use_nodes", icon='SOUND')#'NODETREE')
            # the above replaced with a context hook below:
            layout.operator("WM_OT_context_toggle", text="Use POV-Ray Nodes", icon='NODETREE').data_path = \
                            "material.pov.material_use_nodes"
    
    class MATERIAL_PT_POV_active_node(MaterialButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to show pov active node properties buttons."""
    
    
        bl_label = "Active Node Settings"
        bl_context = "material"
        bl_options = {'HIDE_HEADER'}
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        @classmethod
        def poll(cls, context):
            engine = context.scene.render.engine
            mat=context.material
            ob = context.object
    
            return mat and mat.pov.type == "SURFACE" and (engine in cls.COMPAT_ENGINES) and mat.pov.material_use_nodes
    
    
    
        def draw(self, context):
            layout = self.layout
            mat = context.material
            node_tree = mat.node_tree
            if node_tree:
                node = node_tree.nodes.active
                if mat.use_nodes:
                    if node:
                        layout.prop(mat.pov,"material_active_node")
                        if node.bl_idname=="PovrayMaterialNode":
                            layout.context_pointer_set("node", node)
                            if hasattr(node, "draw_buttons_ext"):
                                node.draw_buttons_ext(context, layout)
                            elif hasattr(node, "draw_buttons"):
                                node.draw_buttons(context, layout)
                            value_inputs = [socket for socket in node.inputs if socket.enabled and not socket.is_linked]
                            if value_inputs:
                                layout.separator()
    
                                layout.label(text="Inputs:")
    
                                for socket in value_inputs:
                                    row = layout.row()
                                    socket.draw(context, row, node, socket.name)
                        else:
                            layout.context_pointer_set("node", node)
                            if hasattr(node, "draw_buttons_ext"):
                                node.draw_buttons_ext(context, layout)
                            elif hasattr(node, "draw_buttons"):
                                node.draw_buttons(context, layout)
                            value_inputs = [socket for socket in node.inputs if socket.enabled and not socket.is_linked]
                            if value_inputs:
                                layout.separator()
    
                                layout.label(text="Inputs:")
    
                                for socket in value_inputs:
                                    row = layout.row()
                                    socket.draw(context, row, node, socket.name)
                    else:
    
                        layout.label(text="No active nodes!")
    
    class MATERIAL_PT_POV_mirror(MaterialButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define standard material reflectivity (mirror) buttons."""
    
    
        bl_label = "Mirror"
        bl_options = {'DEFAULT_CLOSED'}
    
        bl_idname = "MATERIAL_PT_POV_raytrace_mirror"
    
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        @classmethod
        def poll(cls, context):
            mat = context.material
            engine = context.scene.render.engine
            return check_material(mat) and (mat.pov.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
    
        def draw_header(self, context):
            mat = context.material
            raym = mat.pov_raytrace_mirror
    
            self.layout.prop(raym, "use", text="")
    
        def draw(self, context):
            layout = self.layout
    
            mat = context.material #Formerly : #mat = active_node_mat(context.material)
            raym = mat.pov_raytrace_mirror
    
            layout.active = raym.use
    
            split = layout.split()
    
            col = split.column()
            col.prop(raym, "reflect_factor")
    
            col.prop(raym, "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(factor=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_POV_transp(MaterialButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov material transparency (alpha) buttons."""
    
    
        bl_label = "Transparency"
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        @classmethod
        def poll(cls, context):
            mat = context.material
            engine = context.scene.render.engine
            return check_material(mat) and (mat.pov.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.pov, "use_transparency", text="")
    
        def draw(self, context):
            layout = self.layout
    
            base_mat = context.material
            mat = context.material#FORMERLY active_node_mat(context.material)
            rayt = mat.pov_raytrace_transparency
    
            if simple_material(base_mat):
                row = layout.row()
                row.active = mat.pov.use_transparency
                row.prop(mat.pov, "transparency_method", expand=True)
    
            split = layout.split()
            split.active = base_mat.pov.use_transparency
    
            col = split.column()
            col.prop(mat.pov, "alpha")
            row = col.row()
            row.active = (base_mat.pov.transparency_method != 'MASK') and (not mat.pov.use_shadeless)
            row.prop(mat.pov, "specular_alpha", text="Specular")
    
            col = split.column()
            col.active = (not mat.pov.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.pov.transparency_method == 'RAYTRACE':
                layout.separator()
                split = layout.split()
                split.active = base_mat.pov.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_POV_reflection(MaterialButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define more pov specific reflectivity buttons."""
    
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        bl_parent_id = "MATERIAL_PT_POV_raytrace_mirror"
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
    
        @classmethod
        def poll(cls, context):
            engine = context.scene.render.engine
            mat=context.material
            ob = context.object
    
            return mat and mat.pov.type == "SURFACE" and (engine in cls.COMPAT_ENGINES) and not (mat.pov.material_use_nodes or mat.use_nodes)
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        def draw(self, context):
            layout = self.layout
    
            mat = context.material
    
            col = layout.column()
            col.prop(mat.pov, "irid_enable")
            if mat.pov.irid_enable:
    
    Thomas Dinges's avatar
    Thomas Dinges committed
                col = layout.column()
    
                col.prop(mat.pov, "irid_amount", slider=True)
                col.prop(mat.pov, "irid_thickness", slider=True)
    
                col.prop(mat.pov, "irid_turbulence", slider=True)
    
            col.prop(mat.pov, "conserve_energy")
            col2=col.split().column()
    
            if not mat.pov_raytrace_mirror.use:
    
                col2.label(text="Please Check Mirror settings :")
    
            col2.active = mat.pov_raytrace_mirror.use
    
            col2.prop(mat.pov, "mirror_use_IOR")
            if mat.pov.mirror_use_IOR:
                col2.alignment = 'CENTER'
                col2.label(text="The current Raytrace ")
    
                col2.label(text="Transparency IOR is: " + str(mat.pov.ior))
    
    '''
    #group some native Blender (SSS) and POV (Fade)settings under such a parent panel?
    class MATERIAL_PT_POV_interior(MaterialButtonsPanel, Panel):
        bl_label = "POV-Ray Interior"
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        bl_idname = "material.pov_interior"
        #bl_parent_id = "material.absorption"
    
        COMPAT_ENGINES = {'POVRAY_RENDER'}
        @classmethod
        def poll(cls, context):
            engine = context.scene.render.engine
            mat=context.material
            ob = context.object
            return mat and mat.pov.type == "SURFACE" and (engine in cls.COMPAT_ENGINES) and not (mat.pov.material_use_nodes or mat.use_nodes)
    
        def draw_header(self, context):
            mat = context.material
    
    class MATERIAL_PT_POV_fade_color(MaterialButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov fading (absorption) color buttons."""
    
    
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        #bl_parent_id = "material.pov_interior"
    
        @classmethod
        def poll(cls, context):
            engine = context.scene.render.engine
            mat=context.material
            ob = context.object
    
            return mat and mat.pov.type == "SURFACE" and (engine in cls.COMPAT_ENGINES) and not (mat.pov.material_use_nodes or mat.use_nodes)
    
        def draw_header(self, context):
            mat = context.material
    
    
            self.layout.prop(mat.pov, "interior_fade_color", text="")
    
        def draw(self, context):
            layout = self.layout
            mat = context.material
    
            # layout.active = mat.pov.interior_fade_color
            if mat.pov.interior_fade_color != (0.0, 0.0, 0.0):
                layout.label(text="Raytrace transparency")
                layout.label(text="depth max Limit needs")
                layout.label(text="to be non zero to fade")
    
    class MATERIAL_PT_POV_caustics(MaterialButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov caustics buttons."""
    
    
        bl_label = "Caustics"
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
    
        @classmethod
        def poll(cls, context):
            engine = context.scene.render.engine
            mat=context.material
            ob = context.object
    
            return mat and mat.pov.type == "SURFACE" and (engine in cls.COMPAT_ENGINES) and not (mat.pov.material_use_nodes or mat.use_nodes)
    
        def draw_header(self, context):
            mat = context.material
    
            if mat.pov.caustics_enable:
                self.layout.prop(mat.pov, "caustics_enable", text="", icon="PMARKER_SEL" )
            else:
                self.layout.prop(mat.pov, "caustics_enable", text="", icon="PMARKER" )
    
        def draw(self, context):
    
            layout = self.layout
    
            mat = context.material
    
                col.prop(mat.pov, "refraction_caustics")
                if mat.pov.refraction_caustics:
    
                    col.prop(mat.pov, "refraction_type", text="")
    
                    if mat.pov.refraction_type == "1":
                        col.prop(mat.pov, "fake_caustics_power", slider=True)
                    elif mat.pov.refraction_type == "2":
                        col.prop(mat.pov, "photons_dispersion", slider=True)
                        col.prop(mat.pov, "photons_dispersion_samples", slider=True)
    
                if not mat.pov.refraction_caustics and not mat.pov.photons_reflection:
    
    Thomas Dinges's avatar
    Thomas Dinges committed
                    col = layout.column()
                    col.alignment = 'CENTER'
                    col.label(text="Caustics override is on, ")
                    col.label(text="but you didn't chose any !")
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    class MATERIAL_PT_strand(MaterialButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define Blender strand antialiasing buttons."""
    
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        bl_label = "Strand"
        bl_options = {'DEFAULT_CLOSED'}
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        @classmethod
        def poll(cls, context):
            mat = context.material
            engine = context.scene.render.engine
    
            return mat and (mat.pov.type in {'SURFACE', 'WIRE', 'HALO'}) and (engine in cls.COMPAT_ENGINES)
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    
        def draw(self, context):
            layout = self.layout
    
            mat = context.material  # don't use node material
            tan = mat.strand
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            split = layout.split()
    
            col = split.column()
            sub = col.column(align=True)
            sub.label(text="Size:")
            sub.prop(tan, "root_size", text="Root")
            sub.prop(tan, "tip_size", text="Tip")
            sub.prop(tan, "size_min", text="Minimum")
            sub.prop(tan, "use_blender_units")
            sub = col.column()
            sub.active = (not mat.pov.use_shadeless)
            sub.prop(tan, "use_tangent_shading")
            col.prop(tan, "shape")
    
            col = split.column()
            col.label(text="Shading:")
            col.prop(tan, "width_fade")
            ob = context.object
            if ob and ob.type == 'MESH':
    
                col.prop_search(tan, "uv_layer", ob.data, "tessface_uv_textures", text="")
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            else:
                col.prop(tan, "uv_layer", text="")
            col.separator()
            sub = col.column()
            sub.active = (not mat.pov.use_shadeless)
    
            sub.label(text="Surface diffuse:")
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            sub = col.column()
            sub.prop(tan, "blend_distance", text="Distance")
    
    class MATERIAL_PT_POV_replacement_text(MaterialButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov custom code declared name field."""
    
    
        def draw(self, context):
            layout = self.layout
    
            mat = context.material
    
    
    Thomas Dinges's avatar
    Thomas Dinges committed
            col = layout.column()
    
            col.prop(mat.pov, "replacement_text", text="")
    
    class TEXTURE_MT_POV_specials(bpy.types.Menu):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov texture slot operations buttons."""
    
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        bl_label = "Texture Specials"
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        def draw(self, context):
            layout = self.layout
    
            layout.operator("texture.slot_copy", icon='COPYDOWN')
            layout.operator("texture.slot_paste", icon='PASTEDOWN')
    
    
    class TEXTURE_UL_POV_texture_slots(bpy.types.UIList):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to show pov texture slots list.""" # used?
    
    
        COMPAT_ENGINES = {'POVRAY_RENDER'}
        def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
            ob = data
            slot = item
            #ma = slot.name
            # draw_item must handle the three layout types... Usually 'DEFAULT' and 'COMPACT' can share the same code.
            if self.layout_type in {'DEFAULT', 'COMPACT'}:
                # You should always start your row layout by a label (icon + text), or a non-embossed text field,
                # this will also make the row easily selectable in the list! The later also enables ctrl-click rename.
                # We use icon_value of label, as our given icon is an integer value, not an enum ID.
                # Note "data" names should never be translated!
                if slot:
                    layout.prop(item, "texture", text="", emboss=False, icon='TEXTURE')
                else:
                    layout.label(text="New", translate=False, icon_value=icon)
            # 'GRID' layout type should be as compact as possible (typically a single icon!).
            elif self.layout_type in {'GRID'}:
                layout.alignment = 'CENTER'
                layout.label(text="", icon_value=icon)
    '''
    
    class MATERIAL_TEXTURE_SLOTS_UL_List(UIList):
        """Texture Slots UIList."""
    
    
        def draw_item(self, context, layout, material, item, icon, active_data,
                      material_texture_list_index, index):
            material = context.material#.pov
            active_data = material
            #tex = context.texture #may be needed later?
    
            # We could write some code to decide which icon to use here...
            custom_icon = 'TEXTURE'
    
            # Make sure your code supports all 3 layout types
            if self.layout_type in {'DEFAULT', 'COMPACT'}:
                layout.label(item.name, icon = custom_icon)
    
            elif self.layout_type in {'GRID'}:
                layout.alignment = 'CENTER'
                layout.label("", icon = custom_icon)
    
    class WORLD_TEXTURE_SLOTS_UL_List(UIList):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to show pov texture slots list.""" # XXX Not used yet
    
    
    
    
        def draw_item(self, context, layout, world, item, icon, active_data,
    
                        active_texture_index, index):
    
            world = context.world#.pov
            active_data = world.pov
            #tex = context.texture #may be needed later?
    
            # We could write some code to decide which icon to use here...
            custom_icon = 'TEXTURE'
    
            # Make sure your code supports all 3 layout types
            if self.layout_type in {'DEFAULT', 'COMPACT'}:
                layout.label(item.name, icon = custom_icon)
    
            elif self.layout_type in {'GRID'}:
                layout.alignment = 'CENTER'
                layout.label("", icon = custom_icon)
    
    class MATERIAL_TEXTURE_SLOTS_UL_POV_layerlist(bpy.types.UIList):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to show pov texture slots list."""
    
    
    #    texture_slots:
        index: bpy.props.IntProperty(name='index')
        #foo  = random prop
        def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
            ob = data
            slot = item
            #ma = slot.name
            # draw_item must handle the three layout types... Usually 'DEFAULT' and 'COMPACT' can share the same code.
            if self.layout_type in {'DEFAULT', 'COMPACT'}:
                # You should always start your row layout by a label (icon + text), or a non-embossed text field,
                # this will also make the row easily selectable in the list! The later also enables ctrl-click rename.
                # We use icon_value of label, as our given icon is an integer value, not an enum ID.
                # Note "data" names should never be translated!
                if slot:
                    layout.prop(item, "texture", text="", emboss=False, icon='TEXTURE')
                else:
                    layout.label(text="New", translate=False, icon_value=icon)
            # 'GRID' layout type should be as compact as possible (typically a single icon!).
            elif self.layout_type in {'GRID'}:
                layout.alignment = 'CENTER'
                layout.label(text="", icon_value=icon)
    
    class TEXTURE_PT_POV_context_texture(TextureButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to show pov texture context buttons."""
    
    
        bl_label = ""
        bl_options = {'HIDE_HEADER'}
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        @classmethod
        def poll(cls, context):
            engine = context.scene.render.engine
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            return (engine in cls.COMPAT_ENGINES)
    
            # if not (hasattr(context, "texture_slot") or hasattr(context, "texture_node")):
            #     return False
            return ((context.material or
                     context.world or
                     context.light or
                     context.texture or