Skip to content
Snippets Groups Projects
ui.py 131 KiB
Newer Older
  • Learn to ignore specific revisions
  •                 #col.label(text="Parameters:")
                    col.prop(obj.pov, "st_major_radius")
                    col.prop(obj.pov, "st_minor_radius")
                    col.prop(obj.pov, "st_u")
                    col.prop(obj.pov, "st_v")
                    col.prop(obj.pov, "st_ring")
                    col.prop(obj.pov, "st_cross")
                    col.prop(obj.pov, "st_ie")
                    #col.prop(obj.pov, "st_edit") #?
                    col.prop(obj.pov, "st_accuracy")
                    col.prop(obj.pov, "st_max_gradient")
    
    class OBJECT_PT_POV_obj_parametric(PovDataButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov parametric surface primitive parameters buttons."""
    
    
        bl_label = "POV Parametric surface"
    
        COMPAT_ENGINES = {'POVRAY_RENDER'}
        #bl_options = {'HIDE_HEADER'}
        @classmethod
        def poll(cls, context):
            engine = context.scene.render.engine
            obj = context.object
    
            return (obj and obj.pov.object_as == 'PARAMETRIC' and (engine in cls.COMPAT_ENGINES))
    
        def draw(self, context):
            layout = self.layout
    
            obj = context.object
    
            col = layout.column()
    
            if obj.pov.object_as == 'PARAMETRIC':
                if obj.pov.unlock_parameters == False:
    
                    col.prop(obj.pov, "unlock_parameters", text="Exported parameters below", icon='LOCKED')
    
                    col.label(text="Minimum U: " + str(obj.pov.u_min))
                    col.label(text="Minimum V: " + str(obj.pov.v_min))
                    col.label(text="Maximum U: " + str(obj.pov.u_max))
                    col.label(text="Minimum V: " + str(obj.pov.v_min))
                    col.label(text="X Function: " + str(obj.pov.x_eq))
                    col.label(text="Y Function: " + str(obj.pov.y_eq))
                    col.label(text="Z Function: " + str(obj.pov.x_eq))
    
                else:
    
                    col.prop(obj.pov, "unlock_parameters", text="Edit exported parameters", icon='UNLOCKED')
    
                    col.label(text="3D view proxy may get out of synch")
                    col.active = obj.pov.unlock_parameters
    
    
    
                    layout.operator("pov.parametric_update", text="Update",icon="SCRIPTPLUGINS")
    
    
                    col.prop(obj.pov, "u_min", text="Minimum U")
                    col.prop(obj.pov, "v_min", text="Minimum V")
                    col.prop(obj.pov, "u_max", text="Maximum U")
                    col.prop(obj.pov, "v_max", text="Minimum V")
                    col.prop(obj.pov, "x_eq", text="X Function")
                    col.prop(obj.pov, "y_eq", text="Y Function")
                    col.prop(obj.pov, "z_eq", text="Z Function")
    
    
    class OBJECT_PT_povray_replacement_text(ObjectButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to define pov object replacement field."""
    
    
    Thomas Dinges's avatar
    Thomas Dinges committed
            col = layout.column()
    
            col.prop(obj.pov, "replacement_text", text="")
    
    ###############################################################################
    # Add Povray Objects
    ###############################################################################
    
    class VIEW_MT_POV_primitives_add(bpy.types.Menu):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Define the primitives menu with presets"""
    
        bl_idname = "VIEW_MT_POV_primitives_add"
    
        bl_label = "Povray"
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        @classmethod
        def poll(cls, context):
            engine = context.scene.render.engine
    
            return (engine == 'POVRAY_RENDER')
    
    
        def draw(self,context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
    
            layout.menu(VIEW_MT_POV_Basic_Shapes.bl_idname, text = "Primitives",icon="GROUP")
            layout.menu(VIEW_MT_POV_import.bl_idname, text = "Import",icon="IMPORT")
    
    class VIEW_MT_POV_Basic_Shapes(bpy.types.Menu):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to sort simple primitives menu entries."""
    
    
        bl_idname = "POVRAY_MT_basic_shape_tools"
    
        bl_label = "Basic_shapes"
    
        def draw(self,context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
            layout.operator("pov.addplane", text="Infinite Plane",icon = 'MESH_PLANE')
            layout.operator("pov.addbox", text="Box",icon = 'MESH_CUBE')
    
            layout.operator("pov.addsphere", text="Sphere",icon = 'SHADING_RENDERED')
    
            layout.operator("pov.addcylinder", text="Cylinder",icon="MESH_CYLINDER")
            layout.operator("pov.cone_add", text="Cone",icon="MESH_CONE")
            layout.operator("pov.addtorus", text="Torus",icon = 'MESH_TORUS')
            layout.separator()
            layout.operator("pov.addrainbow", text="Rainbow",icon="COLOR")
            layout.operator("pov.addlathe", text="Lathe",icon = 'MOD_SCREW')
            layout.operator("pov.addprism", text="Prism",icon = 'MOD_SOLIDIFY')
            layout.operator("pov.addsuperellipsoid", text="Superquadric Ellipsoid",icon = 'MOD_SUBSURF')
            layout.operator("pov.addheightfield", text="Height Field",icon="RNDCURVE")
            layout.operator("pov.addspheresweep", text="Sphere Sweep",icon = 'FORCE_CURVE')
            layout.separator()
            layout.operator("pov.addblobsphere", text="Blob Sphere",icon = 'META_DATA')
            layout.separator()
    
            layout.label(text="Isosurfaces")
    
            layout.operator("pov.addisosurfacebox", text="Isosurface Box",icon="META_CUBE")
            layout.operator("pov.addisosurfacesphere", text="Isosurface Sphere",icon="META_BALL")
            layout.operator("pov.addsupertorus", text="Supertorus",icon="SURFACE_NTORUS")
            layout.separator()
            layout.label(text = "Macro based")
    
            layout.operator("pov.addpolygontocircle", text="Polygon To Circle Blending",icon="MOD_CAST")
    
            layout.operator("pov.addloft", text="Loft",icon="SURFACE_NSURFACE")
    
            layout.separator()
            # Warning if the Add Advanced Objects addon containing
            # Add mesh extra objects is not enabled
            if not check_add_mesh_extra_objects():
                #col = box.column()
                layout.label(text="Please enable Add Mesh: Extra Objects addon", icon="INFO")
                #layout.separator()
    
                layout.operator("preferences.addon_show",
    
                             text="Go to Add Mesh: Extra Objects addon",
                             icon="PREFERENCES").module = "add_mesh_extra_objects"
    
                #layout.separator()
                return
            else:
                layout.operator("pov.addparametric", text="Parametric",icon = 'SCRIPTPLUGINS')
    
    class VIEW_MT_POV_import(bpy.types.Menu):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class for the import menu."""
    
    
        bl_idname = "POVRAY_MT_import_tools"
    
        bl_label = "Import"
    
        def draw(self,context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
    
            layout.operator("import_scene.pov",icon="FORCE_LENNARDJONES")
    
    
    def menu_func_add(self, context):
        engine = context.scene.render.engine
        if engine == 'POVRAY_RENDER':
    
            self.layout.menu("VIEW_MT_POV_primitives_add", icon="PLUGIN")
    
    
    def menu_func_import(self, context):
        engine = context.scene.render.engine
        if engine == 'POVRAY_RENDER':
    
            self.layout.operator("import_scene.pov",icon="FORCE_LENNARDJONES")
    
    ##############Nodes
    
    # def find_node_input(node, name):
        # for input in node.inputs:
            # if input.name == name:
                # return input
    
    # def panel_node_draw(layout, id_data, output_type, input_name):
        # if not id_data.use_nodes:
            # #layout.operator("pov.material_use_nodes", icon='SOUND')#'NODETREE')
            # #layout.operator("pov.use_shading_nodes", icon='NODETREE')
            # layout.operator("WM_OT_context_toggle", icon='NODETREE').data_path = \
    
                            # "material.pov.material_use_nodes"
    
            # return False
    
        # ntree = id_data.node_tree
    
        # node = find_node(id_data, output_type)
        # if not node:
            # layout.label(text="No output node")
        # else:
            # input = find_node_input(node, input_name)
            # layout.template_node_view(ntree, node, input)
    
        # return True
    
    
    class NODE_MT_POV_map_create(bpy.types.Menu):
    
        """Create maps"""
    
        bl_idname = "POVRAY_MT_node_map_create"
    
        bl_label = "Create map"
    
        def draw(self,context):
            layout = self.layout
            layout.operator("node.map_create")
    
    def menu_func_nodes(self, context):
        ob = context.object
        if hasattr(ob,'active_material'):
            mat=context.object.active_material
            if mat and context.space_data.tree_type == 'ObjectNodeTree':
                self.layout.prop(mat.pov,"material_use_nodes")
    
                self.layout.menu(NODE_MT_POV_map_create.bl_idname)
    
                self.layout.operator("wm.updatepreviewkey")
            if hasattr(mat,'active_texture') and context.scene.render.engine == 'POVRAY_RENDER':
                tex=mat.active_texture
                if tex and context.space_data.tree_type == 'TextureNodeTree':
                    self.layout.prop(tex.pov,"texture_use_nodes")
    
    
    
    ###############################################################################
    # Camera Povray Settings
    
    ###############################################################################
    
    class CAMERA_PT_POV_cam_dof(CameraDataButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class for camera depth of field focal blur buttons."""
    
    
        bl_label = "POV Aperture"
    
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        bl_parent_id = "DATA_PT_camera_dof_aperture"
        bl_options = {'HIDE_HEADER'}
        #def draw_header(self, context):
            #cam = context.camera
    
            #self.layout.prop(cam.pov, "dof_enable", text="")
    
        def draw(self, context):
            layout = self.layout
    
            cam = context.camera
    
    
            layout.active = cam.dof.use_dof
            layout.use_property_split = True # Active single-column layout
    
            flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
    
            col = flow.column()
            col.label(text="F-Stop value will export as")
    
            col.label(text="POV aperture : " + "%.3f" % (1/cam.dof.aperture_fstop*1000))
    
            col = flow.column()
    
            col.prop(cam.pov, "dof_samples_min")
            col.prop(cam.pov, "dof_samples_max")
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            col.prop(cam.pov, "dof_variance")
    
    class CAMERA_PT_POV_cam_nor(CameraDataButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class for camera normal perturbation buttons."""
    
    
        bl_label = "POV Perturbation"
    
        COMPAT_ENGINES = {'POVRAY_RENDER'}
    
        def draw_header(self, context):
            cam = context.camera
    
            self.layout.prop(cam.pov, "normal_enable", text="")
    
        def draw(self, context):
            layout = self.layout
    
            cam = context.camera
    
            layout.active = cam.pov.normal_enable
    
            layout.prop(cam.pov,"normal_patterns")
            layout.prop(cam.pov,"cam_normal")
            layout.prop(cam.pov,"turbulence")
            layout.prop(cam.pov,"scale")
    
    
    
    class CAMERA_PT_POV_replacement_text(CameraDataButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class for camera text replacement field."""
    
    
    Thomas Dinges's avatar
    Thomas Dinges committed
            col = layout.column()
    
            col.prop(cam.pov, "replacement_text", text="")
    
    ###############################################################################
    # Text Povray Settings
    ###############################################################################
    
    
    class TEXT_OT_POV_insert(Operator):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to create blender text editor operator to insert pov snippets like other pov IDEs."""
    
        bl_idname = "text.povray_insert"
        bl_label = "Insert"
    
    
        filepath : bpy.props.StringProperty(name="Filepath", subtype='FILE_PATH')
    
    
        @classmethod
        def poll(cls, context):
            # context.area.type == 'TEXT_EDITOR'
            return bpy.ops.text.insert.poll()
    
        def execute(self, context):
            if self.filepath and isfile(self.filepath):
                file = open(self.filepath, "r")
                bpy.ops.text.insert(text=file.read())
    
                # places the cursor at the end without scrolling -.-
                # context.space_data.text.write(file.read())
                file.close()
            return {'FINISHED'}
    
    def validinsert(ext):
    
    	return ext in {".txt",".inc",".pov"}
    
    
    class TEXT_MT_POV_insert(bpy.types.Menu):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to create a menu launcher in text editor for the TEXT_OT_POV_insert operator ."""
    
    
        bl_idname = "TEXT_MT_POV_insert"
    
    
        def draw(self, context):
            pov_documents = locate_docpath()
            prop = self.layout.operator("wm.path_open", text="Open folder", icon='FILE_FOLDER')
            prop.filepath = pov_documents
            self.layout.separator()
    
            list=[]
            for root,dirs,files in os.walk(pov_documents):
                list.append(root)
            print(list)
            self.path_menu(list,
                           "text.povray_insert",
                           #{"internal": True},
    					   filter_ext= validinsert
                           )
    
    class TEXT_PT_POV_custom_code(TextButtonsPanel, Panel):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to create a panel in text editor for the user to decide if he renders text only or adds to 3d scene."""
    
    
    Thomas Dinges's avatar
    Thomas Dinges committed
            text = context.space_data.text
    
            if not pov_documents :
    
                layout.label(text="Please configure ", icon="INFO")
                layout.label(text="default pov include path ")
                layout.label(text="in addon preferences")
                #layout.separator()
    
                layout.operator("preferences.addon_show",
    
                             text="Go to Render: Persistence of Vision addon",
    
                             icon="PREFERENCES").module = "render_povray"
    
                #layout.separator()
            else:
                #print(pov_documents)
    
                layout.menu(TEXT_MT_POV_insert.bl_idname)
    
                box.label(text='Source to render:', icon='RENDER_STILL')
    
                row = box.row()
                row.prop(text.pov, "custom_code",expand = True)
                if text.pov.custom_code in {'3dview'}:
    
                    box.operator("render.render", icon='OUTLINER_DATA_POSE')
    
                if text.pov.custom_code in {'text'}:
                    rtext = bpy.context.space_data.text
                    box.operator("text.run", icon='POSE_DATA')
                #layout.prop(text.pov, "custom_code")
                elif text.pov.custom_code in {'both'}:
                    box.operator("render.render", icon='POSE_HLT')
                    layout.label(text="Please specify declared", icon="INFO")
                    layout.label(text="items in properties ")
    
                    #layout.label(text="")
    
    ###############################################
    # Text editor templates from header menu
    
    class TEXT_MT_POV_templates(bpy.types.Menu):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        """Use this class to create a menu for the same pov templates scenes as other pov IDEs."""
    
    
    
        # We list templates on file evaluation, we can assume they are static data,
        # and better avoid running this on every draw call.
        import os
        template_paths = [os.path.join(os.path.dirname(__file__), "templates_pov")]
    
        def draw(self, context):
            self.path_menu(
                self.template_paths,
                "text.open",
                props_default={"internal": True},
            )
    
    def menu_func_templates(self, context):
    
        # Do not depend on POV being active renderer here...
        self.layout.menu("TEXT_MT_POV_templates")
    
        WORLD_MT_POV_presets,
        WORLD_OT_POV_add_preset,
    
        WORLD_TEXTURE_SLOTS_UL_List,
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        WORLD_PT_POV_mist,
    
        #RenderButtonsPanel,
        #ModifierButtonsPanel,
        #MaterialButtonsPanel,
        #TextureButtonsPanel,
        #ObjectButtonsPanel,
        #CameraDataButtonsPanel,
        #WorldButtonsPanel,
        #TextButtonsPanel,
        #PovDataButtonsPanel,
        DATA_PT_POV_normals,
        DATA_PT_POV_texture_space,
        DATA_PT_POV_vertex_groups,
        DATA_PT_POV_shape_keys,
        DATA_PT_POV_uv_texture,
        DATA_PT_POV_vertex_colors,
        DATA_PT_POV_customdata,
        #PovLampButtonsPanel,
        LIGHT_PT_POV_preview,
        LIGHT_PT_POV_light,
    
        LIGHT_MT_POV_presets,
        LIGHT_OT_POV_add_preset,
        OBJECT_PT_POV_rainbow,
        RENDER_PT_POV_export_settings,
        RENDER_PT_POV_render_settings,
        RENDER_PT_POV_photons,
        RENDER_PT_POV_antialias,
        RENDER_PT_POV_radiosity,
    
        POV_RADIOSITY_MT_presets,
    
        RENDER_OT_POV_radiosity_add_preset,
        RENDER_PT_POV_media,
        MODIFIERS_PT_POV_modifiers,
    
        MATERIAL_MT_POV_sss_presets,
    
        MATERIAL_OT_POV_sss_add_preset,
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        MATERIAL_PT_strand,
    
        MATERIAL_PT_POV_activate_node,
        MATERIAL_PT_POV_active_node,
    
        MATERIAL_PT_POV_reflection,
    
        #MATERIAL_PT_POV_interior,
    
        MATERIAL_PT_POV_fade_color,
        MATERIAL_PT_POV_caustics,
        MATERIAL_PT_POV_replacement_text,
        TEXTURE_MT_POV_specials,
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        TEXTURE_PT_POV_context_texture,
    
        TEXTURE_PT_POV_type,
        TEXTURE_PT_POV_preview,
        TEXTURE_PT_POV_parameters,
        TEXTURE_PT_POV_tex_gamma,
        OBJECT_PT_POV_obj_parameters,
        OBJECT_PT_POV_obj_sphere,
        OBJECT_PT_POV_obj_cylinder,
        OBJECT_PT_POV_obj_cone,
        OBJECT_PT_POV_obj_superellipsoid,
        OBJECT_PT_POV_obj_torus,
        OBJECT_PT_POV_obj_supertorus,
        OBJECT_PT_POV_obj_parametric,
    
        OBJECT_PT_povray_replacement_text,
    
        VIEW_MT_POV_primitives_add,
        VIEW_MT_POV_Basic_Shapes,
        VIEW_MT_POV_import,
        NODE_MT_POV_map_create,
        CAMERA_PT_POV_cam_dof,
        CAMERA_PT_POV_cam_nor,
        CAMERA_PT_POV_replacement_text,
        TEXT_OT_POV_insert,
        TEXT_MT_POV_insert,
        TEXT_PT_POV_custom_code,
        TEXT_MT_POV_templates,
    
        # TEXTURE_PT_context,
        #TEXTURE_PT_POV_povray_texture_slots,
    
        TEXTURE_UL_POV_texture_slots,
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        MATERIAL_TEXTURE_SLOTS_UL_POV_layerlist,
    
        MATERIAL_OT_POV_texture_slot_add,
        MATERIAL_OT_POV_texture_slot_remove,
        TEXTURE_PT_POV_influence
    
    )
    
    
    def register():
        #from bpy.utils import register_class
    
        for cls in classes:
            register_class(cls)
    
        bpy.types.VIEW3D_MT_add.prepend(menu_func_add)
        bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
        bpy.types.TEXT_MT_templates.append(menu_func_templates)
    
        bpy.types.RENDER_PT_POV_radiosity.prepend(rad_panel_func)
    
        bpy.types.LIGHT_PT_POV_light.prepend(light_panel_func)
        #bpy.types.WORLD_PT_POV_world.prepend(world_panel_func)
        # was used for parametric objects but made the other addon unreachable on
        # unregister for other tools to use created a user action call instead
        #addon_utils.enable("add_mesh_extra_objects", default_set=False, persistent=True)
    
    
        #bpy.types.TEXTURE_PT_context_texture.prepend(TEXTURE_PT_POV_type)
    
    
    def unregister():
        #from bpy.utils import unregister_class
    
    
        #bpy.types.TEXTURE_PT_context_texture.remove(TEXTURE_PT_POV_type)
    
        #addon_utils.disable("add_mesh_extra_objects", default_set=False)
        #bpy.types.WORLD_PT_POV_world.remove(world_panel_func)
        bpy.types.LIGHT_PT_POV_light.remove(light_panel_func)
    
        bpy.types.RENDER_PT_POV_radiosity.remove(rad_panel_func)
    
        bpy.types.TEXT_MT_templates.remove(menu_func_templates)
        bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)
    
        bpy.types.VIEW3D_MT_add.remove(menu_func_add)
    
        for cls in reversed(classes):
            unregister_class(cls)