Skip to content
Snippets Groups Projects
scene_amaranth_toolset.py 100 KiB
Newer Older
  • Learn to ignore specific revisions
  • Pablo Vazquez's avatar
    Pablo Vazquez committed
        clear = False
    
        @classmethod
        def poll(cls, context):
            return context.active_object.dupli_group
    
        def execute(self, context):
            self.__class__.clear = False
            ob = context.active_object
            amth_text_exists = amaranth_text_startup(context)
            script_exists = False
            script_intro = "# OB ID: %s" % ob.name
            obdata = "bpy.data.objects['%s']" % ob.name
            script = "%s" % (
                "\nif %(obdata)s and %(obdata)s.dupli_group and %(obdata)s.pass_index != 0: %(obname)s \n"
                "    for dob in %(obdata)s.dupli_group.objects: %(obname)s \n"
                "        dob.pass_index = %(obdata)s.pass_index %(obname)s \n" %
                    {'obdata' : obdata, 'obname' : script_intro})
    
            for txt in bpy.data.texts:
                if txt.name == amth_text.name:
                    for li in txt.lines:
                        if script_intro == li.body:
                            script_exists = True
                            continue
    
            if not script_exists:
                amth_text.write("\n")
                amth_text.write(script_intro)
                amth_text.write(script)
    
            if ob and ob.dupli_group:
                if ob.pass_index != 0:
                    for dob in ob.dupli_group.objects:
                        dob.pass_index = ob.pass_index
    
            self.report({'INFO'},
                "%s ID: %s to all objects in this Dupli Group" % (
                    "Applied" if not script_exists else "Updated",
                    ob.pass_index))
    
            return{'FINISHED'}
    
    class AMTH_OBJECT_OT_id_dupligroup_clear(Operator):
        '''Clear the Object ID from objects in dupli group'''
        bl_idname = "object.amaranth_object_id_duplis_clear"
        bl_label = "Clear Object ID from Duplis"
    
        @classmethod
        def poll(cls, context):
            return context.active_object.dupli_group
    
        def execute(self, context):
            context.active_object.pass_index = 0
            AMTH_OBJECT_OT_id_dupligroup.clear = True
            amth_text_exists = amaranth_text_startup(context)
            match_first = "# OB ID: %s" % context.active_object.name
    
            if amth_text_exists:
                for txt in bpy.data.texts:
                    if txt.name == amth_text.name:
                        for li in txt.lines:
                            if match_first in li.body:
                                li.body = ''
                                continue
    
            self.report({'INFO'}, "Object IDs back to normal")
            return{'FINISHED'}
    
    def ui_object_id_duplis(self, context):
    
        if context.active_object.dupli_group:
            split = self.layout.split()
            row = split.row(align=True)
            row.enabled = context.active_object.pass_index != 0
            row.operator(
                AMTH_OBJECT_OT_id_dupligroup.bl_idname)
            row.operator(
                AMTH_OBJECT_OT_id_dupligroup_clear.bl_idname,
                icon="X", text="")
            split.separator()
    
            if AMTH_OBJECT_OT_id_dupligroup.clear:
                self.layout.label(text="Next time you save/reload this file, "
                                            "object IDs will be back to normal",
                                  icon="INFO")
    
    # // FEATURE: Object ID for objects inside DupliGroups
    # UI: Warning about Z not connected when using EXR
    def ui_render_output_z(self, context):
    
        scene = bpy.context.scene
        image = scene.render.image_settings
        if scene.render.use_compositing and \
            image.file_format == 'OPEN_EXR' and \
            image.use_zbuffer:
            if scene.node_tree and scene.node_tree.nodes:
                for no in scene.node_tree.nodes:
                    if no.type == 'COMPOSITE':
                        if not no.inputs['Z'].is_linked:
                            self.layout.label(
                                text="The Z output in node \"%s\" is not connected" % 
                                    no.name, icon="ERROR")
    
    # // UI: Warning about Z not connected
    
    # FEATURE: Delete Materials not assigned to any verts
    class AMTH_OBJECT_OT_material_remove_unassigned(Operator):
        '''Remove materials not assigned to any vertex'''
        bl_idname = "object.amaranth_object_material_remove_unassigned"
        bl_label = "Remove Unassigned Materials"
    
        @classmethod
        def poll(cls, context):
            return context.active_object.material_slots
    
        def execute(self, context):
    
            act_ob = context.active_object
            count = len(act_ob.material_slots)
            materials_removed = []
            act_ob.active_material_index = 0
    
            for slot in act_ob.material_slots:
                count -= 1
    
                bpy.ops.object.mode_set(mode='EDIT')
                bpy.ops.mesh.select_all(action='DESELECT')
                act_ob.active_material_index = count
                bpy.ops.object.material_slot_select()
                
                if act_ob.data.total_vert_sel == 0 or \
                    (len(act_ob.material_slots) == 1 and not \
                        act_ob.material_slots[0].material):
                    materials_removed.append(
                        "%s" % act_ob.active_material.name if act_ob.active_material else "Empty")
                    bpy.ops.object.mode_set(mode='OBJECT')
                    bpy.ops.object.material_slot_remove()
                else:
                    pass
    
            bpy.ops.object.mode_set(mode='EDIT')
            bpy.ops.mesh.select_all(action='DESELECT')
            bpy.ops.object.mode_set(mode='OBJECT')
    
            if materials_removed:
                print("\n* Removed %s Unassigned Materials \n" % len(materials_removed))
    
                count_mr = 0
    
                for mr in materials_removed:
                    count_mr += 1
                    print("%0.2d. %s" % (count_mr, materials_removed[count_mr - 1]))
    
                print("\n")
                self.report({'INFO'}, "Removed %s Unassigned Materials" %
                    len(materials_removed))
    
            return{'FINISHED'}
    
    def ui_material_remove_unassigned(self, context):
    
        self.layout.operator(
            AMTH_OBJECT_OT_material_remove_unassigned.bl_idname,
            icon="X")
    
    # // FEATURE: Delete Materials not assigned to any verts
    # FEATURE: Cycles Samples Percentage
    class AMTH_RENDER_OT_cycles_samples_percentage_set(Operator):
        '''Save the current number of samples per shader as final (gets saved in .blend)'''
        bl_idname = "scene.amaranth_cycles_samples_percentage_set"
        bl_label = "Set as Render Samples"
    
        def execute(self, context):
            cycles = context.scene.cycles
            cycles.use_samples_final = True
    
            context.scene['amth_cycles_samples_final'] = [
                cycles.diffuse_samples,
                cycles.glossy_samples,
                cycles.transmission_samples,
                cycles.ao_samples,
                cycles.mesh_light_samples,
                cycles.subsurface_samples,
                cycles.volume_samples]
    
            self.report({'INFO'}, "Render Samples Saved")
    
            return{'FINISHED'}
    
    
    class AMTH_RENDER_OT_cycles_samples_percentage(Operator):
        '''Set a percentage of the final render samples'''
        bl_idname = "scene.amaranth_cycles_samples_percentage"
        bl_label = "Set Render Samples Percentage"
    
        percent = IntProperty(
                    name="Percentage",
                    description="Percentage to divide render samples by",
                    subtype='PERCENTAGE',
                    default=0)
    
        def execute(self, context):
            percent = self.percent
            cycles = context.scene.cycles
            cycles_samples_final = context.scene['amth_cycles_samples_final']
    
            cycles.use_samples_final = False
    
            if percent == 100:
                cycles.use_samples_final = True
    
            cycles.diffuse_samples = int((cycles_samples_final[0] / 100) * percent)
            cycles.glossy_samples = int((cycles_samples_final[1] / 100) * percent)
            cycles.transmission_samples = int((cycles_samples_final[2] / 100) * percent)
            cycles.ao_samples = int((cycles_samples_final[3] / 100) * percent)
            cycles.mesh_light_samples = int((cycles_samples_final[4] / 100) * percent)
            cycles.subsurface_samples = int((cycles_samples_final[5] / 100) * percent)
            cycles.volume_samples = int((cycles_samples_final[6] / 100) * percent)
    
            return{'FINISHED'}
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
    # //FEATURE: Cycles Samples Percentage
    # FEATURE: Jump forward/backward every N frames
    class AMTH_SCREEN_OT_frame_jump(Operator):
        '''Jump a number of frames forward/backwards'''
        bl_idname = "screen.amaranth_frame_jump"
        bl_label = "Jump Frames"
    
        forward = BoolProperty(default=True)
    
        def execute(self, context):
            scene = context.scene
            preferences = context.user_preferences.addons[__name__].preferences
    
            if self.forward:
                scene.frame_current = scene.frame_current + preferences.frames_jump
            else:
                scene.frame_current = scene.frame_current - preferences.frames_jump
    
            return{'FINISHED'}
    
    def ui_userpreferences_edit(self, context):
        preferences = context.user_preferences.addons[__name__].preferences
    
        col = self.layout.column()
        split = col.split(percentage=0.21)
        split.prop(preferences, "frames_jump",
                   text="Frames to Jump")
    
    # // FEATURE: Jump forward/backward every N frames
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
    # FEATURE: Set Layers to Render
    class AMTH_SCENE_OT_layers_render_save(Operator):
        '''Save the current scene layers as those that should be enabled for final renders'''
        bl_idname = "scene.amaranth_layers_render_save"
        bl_label = "Save as Layers for Render"
    
        def execute(self, context):
            which = []
            n = -1
    
            for l in context.scene.layers:
                n += 1
                if l:
                    which.append(n)
    
            context.scene['amth_layers_for_render'] = which
            self.report({'INFO'}, "Layers for Render Saved")
    
            return{'FINISHED'}
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
    class AMTH_SCENE_OT_layers_render_view(Operator):
        '''Enable the scene layers that should be active for final renders'''
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bl_idname = "scene.amaranth_layers_render_view"
        bl_label = "View Layers for Render"
    
        def execute(self, context):
            scene = context.scene
            layers_render = scene['amth_layers_for_render']
    
            for window in bpy.context.window_manager.windows:
                screen = window.screen
    
                for area in screen.areas:
                    if area.type == 'VIEW_3D':
    
                        override = {'window': window, 'screen': screen, 'scene': scene, 
                                    'area': area, 'region': area.regions[4],
                                    'blend_data': context.blend_data}
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
    
                        if layers_render:
                            bpy.ops.view3d.layers(override, nr=layers_render[0]+1, extend=False, toggle=False)
    
                            for n in layers_render:
                                context.scene.layers[n] = True
                        else:
                            bpy.ops.view3d.layers(override, nr=1, extend=False, toggle=False)
                            self.report({'INFO'}, "No layers set for render")
    
                        break
    
            return{'FINISHED'}
    
    class AMTH_SCENE_OT_layers_render_set_individual(Operator):
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        '''Whether this layer should be enabled or not for final renders'''
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bl_idname = "scene.amaranth_layers_render_set_individual"
        bl_label = "Set This Layer for Render"
    
        toggle = BoolProperty()
        number = IntProperty()
    
        def execute(self, context):
            toggle = self.toggle
            number = self.number
    
            new_layers = []
    
            for la in context.scene['amth_layers_for_render']:
                new_layers.append(la)
    
            if len(context.scene['amth_layers_for_render']) and number in new_layers:
                new_layers.remove(number)
            else:
                new_layers.append(number)
    
            # Remove Duplicates
            new_layers = list(set(new_layers))
            context.scene['amth_layers_for_render'] = new_layers
    
            bpy.ops.scene.amaranth_layers_render_view()
    
            return{'FINISHED'}
    
    class AMTH_SCENE_OT_layers_render_clear(Operator):
        '''Clear layers for render'''
        bl_idname = "scene.amaranth_layers_render_clear"
        bl_label = "Clear Layers for Render"
    
        def execute(self, context):
    
            if context.scene.get('amth_layers_for_render'):
                context.scene['amth_layers_for_render'] = []
    
            return{'FINISHED'}
    
    def ui_layers_for_render(self, context):
    
        lfr_available = context.scene.get('amth_layers_for_render')
        if lfr_available:
            lfr = context.scene['amth_layers_for_render']
    
        layout = self.layout
        layout.label("Layers for Rendering:")
        split = layout.split()
        col = split.column(align=True)
        row = col.row(align=True)
        row.operator(
            AMTH_SCENE_OT_layers_render_save.bl_idname,
            text="Replace Layers" if lfr_available else "Save Current Layers for Render",
            icon="FILE_REFRESH" if lfr_available else 'LAYER_USED')
    
        if lfr_available:
            row.operator(
                AMTH_SCENE_OT_layers_render_clear.bl_idname,
                icon='X', text="")
            col = col.column(align=True)
            col.enabled = True if lfr_available else False
            col.operator(
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                AMTH_SCENE_OT_layers_render_view.bl_idname,
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                icon="RESTRICT_VIEW_OFF")
    
            split = split.split()
            col = split.column(align=True)
            row = col.row(align=True)
    
            for n in range(0,5):
                row.operator(
                    AMTH_SCENE_OT_layers_render_set_individual.bl_idname, text="",
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                    icon='LAYER_ACTIVE' if n in lfr else 'BLANK1').number = n
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
            row = col.row(align=True)
            for n in range(10,15):
                row.operator(
                    AMTH_SCENE_OT_layers_render_set_individual.bl_idname, text="",
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                    icon='LAYER_ACTIVE' if n in lfr else 'BLANK1').number = n
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
    
            split = split.split()
            col = split.column(align=True)
            row = col.row(align=True)
    
            for n in range(5,10):
                row.operator(
                    AMTH_SCENE_OT_layers_render_set_individual.bl_idname, text="",
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                    icon='LAYER_ACTIVE' if n in lfr else 'BLANK1').number = n
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
            row = col.row(align=True)
            for n in range(15,20):
                row.operator(
                    AMTH_SCENE_OT_layers_render_set_individual.bl_idname, text="",
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                    icon='LAYER_ACTIVE' if n in lfr else 'BLANK1').number = n
    
    def ui_layers_for_render_header(self, context):
        if context.scene.get('amth_layers_for_render'):
            self.layout.operator(
                AMTH_SCENE_OT_layers_render_view.bl_idname,
                text="", icon="IMGDISPLAY")
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
    # // FEATURE: Set Layers to Render
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
    # FEATURE: Lighters Corner
    class AMTH_LightersCorner(bpy.types.Panel):
        """The Lighters Panel"""
        bl_label = "Lighter's Corner"
        bl_idname = "AMTH_SCENE_PT_lighters_corner"
        bl_space_type = 'PROPERTIES'
        bl_region_type = 'WINDOW'
        bl_context = "scene"
    
        @classmethod
        def poll(cls, context):
            any_lamps = False
            for ob in bpy.data.objects:
    
                if ob.type == 'LAMP' or cycles_is_emission(context, ob):
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                    any_lamps = True
                else:
                    pass
            return any_lamps
    
        def draw_header(self, context):
            layout = self.layout
            layout.label(text="", icon="LAMP_SUN")
    
        def draw(self, context):
            layout = self.layout
            scene = context.scene
            objects =  bpy.data.objects
            ob_act = context.active_object
            lamps = bpy.data.lamps
    
            list_meshlights = scene.amaranth_lighterscorner_list_meshlights
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
            engine = scene.render.engine
    
    
            layout.prop(scene, "amaranth_lighterscorner_list_meshlights")
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
            box = layout.box()
            if lamps:
                if objects:
                    row = box.row(align=True)
                    split = row.split(percentage=0.42)
                    col = split.column()
                    col.label(text="Name")
    
                    split = split.split(percentage=0.1)
                    col = split.column()
                    col.label(text="", icon="BLANK1")
                    if engine in ['CYCLES', 'BLENDER_RENDER']:
                        if engine == 'BLENDER_RENDER':
                            split = split.split(percentage=0.7)
                        else:
                            split = split.split(percentage=0.35)
                        col = split.column()
                        col.label(text="Samples")
    
                    if engine == 'CYCLES':
                        split = split.split(percentage=0.35)
                        col = split.column()
                        col.label(text="Size")
    
                    split = split.split(percentage=0.8)
                    col = split.column()
                    col.label(text="Visibility")
    
                    for ob in objects:
    
                        is_lamp = ob.type == 'LAMP'
                        is_emission = True if cycles_is_emission(context, ob) and list_meshlights else False
    
                        if ob and is_lamp or is_emission:
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                            lamp = ob.data
                            clamp = ob.data.cycles
    
                            row = box.row(align=True)
                            split = row.split(percentage=0.5)
                            col = split.column()
                            row = col.row()
                            row.alignment = 'LEFT'
                            row.operator(AMTH_SCENE_OT_amaranth_object_select.bl_idname,
                                        text='%s %s%s' % (
                                            " [L] " if ob.library else "",
                                            ob.name,
                                            "" if ob.name in context.scene.objects else " [Not in Scene]"),
    
                                        icon="%s" % ('LAMP_%s' % ob.data.type if is_lamp else 'MESH_GRID'),
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                                        emboss=False).object = ob.name
                            if ob.library:
                                row = col.row(align=True)
                                row.alignment = "LEFT"
                                row.operator(AMTH_SCENE_OT_blender_instance_open.bl_idname,
                                             text=ob.library.filepath,
                                             icon="LINK_BLEND",
                                             emboss=False).filepath=ob.library.filepath
    
                            if engine == 'CYCLES':
                                split = split.split(percentage=0.35)
                                col = split.column()
    
                                if is_lamp:
                                    if scene.cycles.progressive == 'BRANCHED_PATH':
                                        col.prop(clamp, "samples", text="")
                                    if scene.cycles.progressive == 'PATH':
                                       col.label(text="N/A")
                                else:
                                  col.label(text="N/A")
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                            if engine == 'BLENDER_RENDER':
                                split = split.split(percentage=0.7)
                                col = split.column()
    
                                if is_lamp:
                                    if lamp.type == 'HEMI':
                                        col.label(text="Not Available")
                                    elif lamp.type == 'AREA' and lamp.shadow_method == 'RAY_SHADOW':
                                        row = col.row(align=True)
                                        row.prop(lamp, "shadow_ray_samples_x", text="X")
                                        if lamp.shape == 'RECTANGLE':
                                            row.prop(lamp, "shadow_ray_samples_y", text="Y")
                                    elif lamp.shadow_method == 'RAY_SHADOW':
                                        col.prop(lamp, "shadow_ray_samples", text="Ray Samples")
                                    elif lamp.shadow_method == 'BUFFER_SHADOW':
                                        col.prop(lamp, "shadow_buffer_samples", text="Buffer Samples")
                                    else:
                                        col.label(text="No Shadow")
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                                else:
    
                                  col.label(text="N/A")
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
    
                            if engine == 'CYCLES':
                                split = split.split(percentage=0.4)
                                col = split.column()
    
                                if is_lamp:
                                    if lamp.type in ['POINT','SUN', 'SPOT']:
                                        col.label(text="%.2f" % lamp.shadow_soft_size)
                                    elif lamp.type == 'HEMI':
                                        col.label(text="N/A")
                                    elif lamp.type == 'AREA' and lamp.shape == 'RECTANGLE':
                                        col.label(text="%.2fx%.2f" % (lamp.size, lamp.size_y))
                                    else:
                                        col.label(text="%.2f" % lamp.size)
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
                                else:
    
                                  col.label(text="N/A")
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
    
                            split = split.split(percentage=0.8)
                            col = split.column()
                            row = col.row(align=True)
                            row.prop(ob, "hide", text="", emboss=False)
                            row.prop(ob, "hide_render", text="", emboss=False)
    
                            split = split.split(percentage=0.3)
                            col = split.column()
                            col.label(text="", icon="%s" % "TRIA_LEFT" if ob == ob_act else "BLANK1")
            else:
                box.label(text="No Lamps", icon="LAMP_DATA")
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
    classes = (AMTH_SCENE_MT_color_management_presets,
               AMTH_AddPresetColorManagement,
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
               AMTH_LightersCorner,
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
               AMTH_SCENE_PT_scene_debug,
               AMTH_SCENE_OT_refresh,
               AMTH_SCENE_OT_cycles_shader_list_nodes,
               AMTH_SCENE_OT_cycles_shader_list_nodes_clear,
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
               AMTH_SCENE_OT_amaranth_object_select,
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
               AMTH_SCENE_OT_list_missing_node_links,
               AMTH_SCENE_OT_list_missing_material_slots,
               AMTH_SCENE_OT_list_missing_material_slots_clear,
               AMTH_SCENE_OT_blender_instance_open,
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
               AMTH_SCENE_OT_layers_render_save,
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
               AMTH_SCENE_OT_layers_render_view,
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
               AMTH_SCENE_OT_layers_render_set_individual,
               AMTH_SCENE_OT_layers_render_clear,
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
               AMTH_WM_OT_save_reload,
               AMTH_MESH_OT_find_asymmetric,
               AMTH_MESH_OT_make_symmetric,
               AMTH_NODE_OT_AddTemplateVignette,
               AMTH_NODE_MT_amaranth_templates,
               AMTH_FILE_OT_directory_current_blend,
               AMTH_FILE_OT_directory_go_to,
               AMTH_NODE_PT_indices,
               AMTH_NODE_PT_simplify,
               AMTH_NODE_OT_toggle_mute,
               AMTH_NODE_OT_show_active_node_image,
               AMTH_VIEW3D_OT_render_border_camera,
               AMTH_VIEW3D_OT_show_only_render,
               AMTH_OBJECT_OT_select_meshlights,
               AMTH_OBJECT_OT_id_dupligroup,
               AMTH_OBJECT_OT_id_dupligroup_clear,
               AMTH_OBJECT_OT_material_remove_unassigned,
               AMTH_POSE_OT_paths_clear_all,
               AMTH_POSE_OT_paths_frame_match,
               AMTH_RENDER_OT_cycles_samples_percentage,
               AMTH_RENDER_OT_cycles_samples_percentage_set,
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
               AMTH_FILE_PT_libraries,
               AMTH_SCREEN_OT_frame_jump)
    
    
    addon_keymaps = []
    
    def register():
    
        bpy.utils.register_class(AmaranthToolsetPreferences)
    
        # UI: Register the panel
        init_properties()
        for c in classes:
            bpy.utils.register_class(c)
    
        bpy.types.VIEW3D_MT_object_specials.append(button_refresh)
        bpy.types.VIEW3D_MT_object_specials.append(button_render_border_camera)
        bpy.types.VIEW3D_MT_object_specials.append(button_camera_passepartout)
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.VIEW3D_MT_object_specials.append(button_frame_current)
        bpy.types.VIEW3D_MT_pose_specials.append(button_frame_current)
        bpy.types.VIEW3D_MT_select_object.append(button_select_meshlights)
        bpy.types.VIEW3D_HT_header.append(ui_layers_for_render_header)
    
    
        bpy.types.INFO_MT_file.append(button_save_reload)
        bpy.types.INFO_HT_header.append(stats_scene)
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.TIME_HT_header.append(label_timeline_extra_info)
    
    
        bpy.types.NODE_HT_header.append(node_templates_pulldown)
        bpy.types.NODE_HT_header.append(node_stats)
    
        bpy.types.NODE_HT_header.append(node_shader_extra)
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.NODE_PT_active_node_properties.append(ui_node_normal_values)
    
        bpy.types.CyclesRender_PT_sampling.append(render_cycles_scene_samples)
    
    
        bpy.types.FILEBROWSER_HT_header.append(button_directory_current_blend)
    
        bpy.types.SCENE_PT_simplify.append(unsimplify_ui)
    
        bpy.types.CyclesScene_PT_simplify.append(unsimplify_ui)
    
        bpy.types.DATA_PT_display.append(pose_motion_paths_ui)
    
        bpy.types.RENDER_PT_dimensions.append(render_final_resolution_ui)
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.RENDER_PT_output.append(ui_render_output_z)
    
    
        bpy.types.SCENE_PT_color_management.prepend(ui_color_management_presets)
    
        bpy.types.SEQUENCER_HT_header.append(ui_sequencer_extra_info)
    
        bpy.types.OBJECT_PT_duplication.append(ui_dupli_group_library_path)
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.OBJECT_PT_relations.append(ui_object_id_duplis)
    
        bpy.types.MATERIAL_MT_specials.append(ui_material_remove_unassigned)
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.USERPREF_PT_edit.append(ui_userpreferences_edit)
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.RENDERLAYER_PT_layers.append(ui_layers_for_render)
    
    
        bpy.app.handlers.render_pre.append(unsimplify_render_pre)
        bpy.app.handlers.render_post.append(unsimplify_render_post)
    
        wm = bpy.context.window_manager
        kc = wm.keyconfigs.addon
        if kc:
    
            km = kc.keymaps.new(name='Node Editor', space_type='NODE_EDITOR')
            km.keymap_items.new("node.show_active_node_image", 'ACTIONMOUSE', 'RELEASE')
            km.keymap_items.new("node.show_active_node_image", 'SELECTMOUSE', 'RELEASE')
    
            km = kc.keymaps.new(name='Node Editor', space_type='NODE_EDITOR')
            kmi = km.keymap_items.new('wm.call_menu', 'W', 'PRESS')
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
            kmi.properties.name = "AMTH_NODE_MT_amaranth_templates"
    
            km = kc.keymaps.new(name='Window')
            kmi = km.keymap_items.new('scene.refresh', 'F5', 'PRESS', shift=False, ctrl=False)
            kmi = km.keymap_items.new('wm.save_reload', 'W', 'PRESS', shift=True, ctrl=True)
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
            km = kc.keymaps.new(name='Frames')
            kmi = km.keymap_items.new('screen.amaranth_frame_jump', 'UP_ARROW', 'PRESS', shift=True)
            kmi.properties.forward = True
            kmi = km.keymap_items.new('screen.amaranth_frame_jump', 'DOWN_ARROW', 'PRESS', shift=True)
            kmi.properties.forward = False
    
    
            km = kc.keymaps.new(name='3D View', space_type='VIEW_3D')
            kmi = km.keymap_items.new('view3d.show_only_render', 'Z', 'PRESS', shift=True, alt=True)
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
            km = kc.keymaps.new(name='Graph Editor', space_type='GRAPH_EDITOR')
            kmi = km.keymap_items.new('wm.context_set_enum', 'TAB', 'PRESS', ctrl=True)
            kmi.properties.data_path = 'area.type'
            kmi.properties.value = 'DOPESHEET_EDITOR'
    
            km = kc.keymaps.new(name='Dopesheet', space_type='DOPESHEET_EDITOR')
            kmi = km.keymap_items.new('wm.context_set_enum', 'TAB', 'PRESS', ctrl=True)
            kmi.properties.data_path = 'area.type'
            kmi.properties.value = 'GRAPH_EDITOR'
    
            km = kc.keymaps.new(name='Dopesheet', space_type='DOPESHEET_EDITOR')
            kmi = km.keymap_items.new('wm.context_toggle_enum', 'TAB', 'PRESS', shift=True)
            kmi.properties.data_path = 'space_data.mode'
            kmi.properties.value_1 = 'ACTION'
            kmi.properties.value_2 = 'DOPESHEET'
    
    
            addon_keymaps.append((km, kmi))
    
    def unregister():
    
        bpy.utils.unregister_class(AmaranthToolsetPreferences)
    
        for c in classes:
            bpy.utils.unregister_class(c)
    
        bpy.types.VIEW3D_MT_object_specials.remove(button_refresh)
        bpy.types.VIEW3D_MT_object_specials.remove(button_render_border_camera)
        bpy.types.VIEW3D_MT_object_specials.remove(button_camera_passepartout)
        bpy.types.VIEW3D_MT_object_specials.remove(button_frame_current)
        bpy.types.VIEW3D_MT_pose_specials.remove(button_frame_current)
        bpy.types.VIEW3D_MT_select_object.remove(button_select_meshlights)
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.VIEW3D_HT_header.remove(ui_layers_for_render_header)
    
        bpy.types.INFO_MT_file.remove(button_save_reload)
        bpy.types.INFO_HT_header.remove(stats_scene)
    
    
        bpy.types.TIME_HT_header.remove(label_timeline_extra_info)
    
        bpy.types.NODE_HT_header.remove(node_templates_pulldown)
        bpy.types.NODE_HT_header.remove(node_stats)
    
        bpy.types.NODE_HT_header.remove(node_shader_extra)
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.NODE_PT_active_node_properties.remove(ui_node_normal_values)
    
        bpy.types.CyclesRender_PT_sampling.remove(render_cycles_scene_samples)
    
    
        bpy.types.FILEBROWSER_HT_header.remove(button_directory_current_blend)
    
        bpy.types.SCENE_PT_simplify.remove(unsimplify_ui)
    
        bpy.types.CyclesScene_PT_simplify.remove(unsimplify_ui)
    
        bpy.types.DATA_PT_display.remove(pose_motion_paths_ui)
    
        bpy.types.RENDER_PT_dimensions.remove(render_final_resolution_ui)
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.RENDER_PT_output.remove(ui_render_output_z)
    
    
        bpy.types.SCENE_PT_color_management.remove(ui_color_management_presets)
    
        bpy.types.SEQUENCER_HT_header.remove(ui_sequencer_extra_info)
    
        bpy.types.OBJECT_PT_duplication.remove(ui_dupli_group_library_path)
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.OBJECT_PT_relations.remove(ui_object_id_duplis)
    
        bpy.types.MATERIAL_MT_specials.remove(ui_material_remove_unassigned)
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.USERPREF_PT_edit.remove(ui_userpreferences_edit)
    
    
    Pablo Vazquez's avatar
    Pablo Vazquez committed
        bpy.types.RENDERLAYER_PT_layers.remove(ui_layers_for_render)
    
    
        bpy.app.handlers.render_pre.remove(unsimplify_render_pre)
        bpy.app.handlers.render_post.remove(unsimplify_render_post)
    
        for km, kmi in addon_keymaps:
            km.keymap_items.remove(kmi)
        addon_keymaps.clear()
    
        clear_properties()
    
    if __name__ == "__main__":
        register()