123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- # ##### BEGIN GPL LICENSE BLOCK #####
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License
- # as published by the Free Software Foundation; either version 2
- # of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software Foundation,
- # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- #
- # ##### END GPL LICENSE BLOCK #####
- # <pep8 compliant>
- import bpy
- from bpy.types import Operator
- from bpy.props import IntProperty
- class SequencerCrossfadeSounds(Operator):
- """Do cross-fading volume animation of two selected sound strips"""
- bl_idname = "sequencer.crossfade_sounds"
- bl_label = "Crossfade sounds"
- bl_options = {'REGISTER', 'UNDO'}
- @classmethod
- def poll(cls, context):
- if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip:
- return context.scene.sequence_editor.active_strip.type == 'SOUND'
- else:
- return False
- def execute(self, context):
- seq1 = None
- seq2 = None
- for s in context.scene.sequence_editor.sequences:
- if s.select and s.type == 'SOUND':
- if seq1 is None:
- seq1 = s
- elif seq2 is None:
- seq2 = s
- else:
- seq2 = None
- break
- if seq2 is None:
- self.report({'ERROR'}, "Select 2 sound strips")
- return {'CANCELLED'}
- if seq1.frame_final_start > seq2.frame_final_start:
- s = seq1
- seq1 = seq2
- seq2 = s
- if seq1.frame_final_end > seq2.frame_final_start:
- tempcfra = context.scene.frame_current
- context.scene.frame_current = seq2.frame_final_start
- seq1.keyframe_insert("volume")
- context.scene.frame_current = seq1.frame_final_end
- seq1.volume = 0
- seq1.keyframe_insert("volume")
- seq2.keyframe_insert("volume")
- context.scene.frame_current = seq2.frame_final_start
- seq2.volume = 0
- seq2.keyframe_insert("volume")
- context.scene.frame_current = tempcfra
- return {'FINISHED'}
- else:
- self.report({'ERROR'}, "The selected strips don't overlap")
- return {'CANCELLED'}
- class SequencerCutMulticam(Operator):
- """Cut multi-cam strip and select camera"""
- bl_idname = "sequencer.cut_multicam"
- bl_label = "Cut multicam"
- bl_options = {'REGISTER', 'UNDO'}
- camera: IntProperty(
- name="Camera",
- min=1, max=32,
- soft_min=1, soft_max=32,
- default=1,
- )
- @classmethod
- def poll(cls, context):
- if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip:
- return context.scene.sequence_editor.active_strip.type == 'MULTICAM'
- else:
- return False
- def execute(self, context):
- camera = self.camera
- s = context.scene.sequence_editor.active_strip
- if s.multicam_source == camera or camera >= s.channel:
- return {'FINISHED'}
- if not s.select:
- s.select = True
- cfra = context.scene.frame_current
- bpy.ops.sequencer.cut(frame=cfra, type='SOFT', side='RIGHT')
- for s in context.scene.sequence_editor.sequences_all:
- if s.select and s.type == 'MULTICAM' and s.frame_final_start <= cfra and cfra < s.frame_final_end:
- context.scene.sequence_editor.active_strip = s
- context.scene.sequence_editor.active_strip.multicam_source = camera
- return {'FINISHED'}
- class SequencerDeinterlaceSelectedMovies(Operator):
- """Deinterlace all selected movie sources"""
- bl_idname = "sequencer.deinterlace_selected_movies"
- bl_label = "Deinterlace Movies"
- bl_options = {'REGISTER', 'UNDO'}
- @classmethod
- def poll(cls, context):
- return (context.scene and context.scene.sequence_editor)
- def execute(self, context):
- for s in context.scene.sequence_editor.sequences_all:
- if s.select and s.type == 'MOVIE':
- s.use_deinterlace = True
- return {'FINISHED'}
- classes = (
- SequencerCrossfadeSounds,
- SequencerCutMulticam,
- SequencerDeinterlaceSelectedMovies,
- )
|