WIP, operators SEQUENCER_OT_add_color_strip and SEQUENCER_OT_add_scene_strip
but no menu to access them yet, for now can access them with R and Tkey
This commit is contained in:
@@ -146,6 +146,7 @@ struct ImBuf *give_ibuf_seq_threaded(struct Scene *scene, int rectx, int recty,
|
||||
struct ImBuf *give_ibuf_seq_direct(struct Scene *scene, int rectx, int recty, int cfra, struct Sequence *seq);
|
||||
void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown);
|
||||
void calc_sequence(struct Sequence *seq);
|
||||
void calc_sequence_disp(struct Sequence *seq);
|
||||
void new_tstripdata(struct Sequence *seq);
|
||||
void reload_sequence_new_file(struct Scene *scene, struct Sequence * seq);
|
||||
void sort_seq(struct Scene *scene);
|
||||
|
||||
1174
source/blender/editors/space_sequencer/sequencer_add.c
Normal file
1174
source/blender/editors/space_sequencer/sequencer_add.c
Normal file
@@ -0,0 +1,1174 @@
|
||||
/**
|
||||
*
|
||||
* ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Contributor(s): Blender Foundation, 2003-2009, Campbell Barton
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#else
|
||||
#include <io.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "BLI_blenlib.h"
|
||||
#include "BLI_arithb.h"
|
||||
#include "BLI_storage_types.h"
|
||||
|
||||
#include "IMB_imbuf_types.h"
|
||||
#include "IMB_imbuf.h"
|
||||
|
||||
#include "DNA_ipo_types.h"
|
||||
#include "DNA_curve_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_screen_types.h"
|
||||
#include "DNA_space_types.h"
|
||||
#include "DNA_sequence_types.h"
|
||||
#include "DNA_view2d_types.h"
|
||||
#include "DNA_userdef_types.h"
|
||||
#include "DNA_sound_types.h"
|
||||
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_image.h"
|
||||
#include "BKE_library.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_plugin_types.h"
|
||||
#include "BKE_sequence.h"
|
||||
#include "BKE_scene.h"
|
||||
#include "BKE_utildefines.h"
|
||||
#include "BKE_report.h"
|
||||
|
||||
#include "BIF_gl.h"
|
||||
#include "BIF_glutil.h"
|
||||
|
||||
#include "WM_api.h"
|
||||
#include "WM_types.h"
|
||||
|
||||
#include "RNA_access.h"
|
||||
#include "RNA_define.h"
|
||||
|
||||
/* for menu/popup icons etc etc*/
|
||||
#include "UI_interface.h"
|
||||
#include "UI_resources.h"
|
||||
|
||||
#include "ED_anim_api.h"
|
||||
#include "ED_space_api.h"
|
||||
#include "ED_types.h"
|
||||
#include "ED_screen.h"
|
||||
#include "ED_util.h"
|
||||
|
||||
#include "UI_interface.h"
|
||||
#include "UI_resources.h"
|
||||
#include "UI_view2d.h"
|
||||
|
||||
/* own include */
|
||||
#include "sequencer_intern.h"
|
||||
|
||||
static void BIF_undo_push() {}
|
||||
static void error() {}
|
||||
static void waitcursor() {}
|
||||
static void activate_fileselect() {}
|
||||
static void std_rmouse_transform() {}
|
||||
static int get_mbut() {return 0;}
|
||||
static int pupmenu() {return 0;}
|
||||
static int pupmenu_col() {return 0;}
|
||||
static int okee() {return 0;}
|
||||
static void *find_nearest_marker() {return NULL;}
|
||||
static void deselect_markers() {}
|
||||
static void transform_markers() {}
|
||||
static void transform_seq_nomarker() {}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static Sequence *sfile_to_sequence(Scene *scene, SpaceFile *sfile, int cfra, int machine, int last)
|
||||
{
|
||||
#if 0
|
||||
/* XXX sfile recoded... */
|
||||
Sequence *seq;
|
||||
Strip *strip;
|
||||
StripElem *se;
|
||||
int totsel, a;
|
||||
char name[160];
|
||||
Editing *ed= scene->ed;
|
||||
|
||||
/* are there selected files? */
|
||||
totsel= 0;
|
||||
for(a=0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if( (sfile->filelist[a].type & S_IFDIR)==0 ) {
|
||||
totsel++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(last) {
|
||||
/* if not, a file handed to us? */
|
||||
if(totsel==0 && sfile->file[0]) totsel= 1;
|
||||
}
|
||||
|
||||
if(totsel==0) return 0;
|
||||
|
||||
/* make seq */
|
||||
seq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
seq->len= totsel;
|
||||
|
||||
if(totsel==1) {
|
||||
seq->startstill= 25;
|
||||
seq->endstill= 24;
|
||||
}
|
||||
|
||||
calc_sequence(seq);
|
||||
|
||||
if(sfile->flag & FILE_STRINGCODE) {
|
||||
strcpy(name, sfile->dir);
|
||||
BLI_makestringcode(G.sce, name);
|
||||
} else {
|
||||
strcpy(name, sfile->dir);
|
||||
}
|
||||
|
||||
/* strip and stripdata */
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len= totsel;
|
||||
strip->us= 1;
|
||||
strncpy(strip->dir, name, FILE_MAXDIR-1);
|
||||
strip->stripdata= se= MEM_callocN(totsel*sizeof(StripElem), "stripelem");
|
||||
|
||||
for(a=0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if( (sfile->filelist[a].type & S_IFDIR)==0 ) {
|
||||
strncpy(se->name, sfile->filelist[a].relname, FILE_MAXFILE-1);
|
||||
se++;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* no selected file: */
|
||||
if(totsel==1 && se==strip->stripdata) {
|
||||
strncpy(se->name, sfile->file, FILE_MAXFILE-1);
|
||||
}
|
||||
|
||||
/* last active name */
|
||||
strncpy(ed->act_imagedir, seq->strip->dir, FILE_MAXDIR-1);
|
||||
|
||||
return seq;
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
static int sfile_to_mv_sequence_load(Scene *scene, SpaceFile *sfile, int cfra,
|
||||
int machine, int index )
|
||||
{
|
||||
/* XXX sfile recoded... */
|
||||
Sequence *seq;
|
||||
struct anim *anim;
|
||||
Strip *strip;
|
||||
StripElem *se;
|
||||
int totframe;
|
||||
char name[160];
|
||||
char str[FILE_MAXDIR+FILE_MAXFILE];
|
||||
Editing *ed= scene->ed;
|
||||
|
||||
totframe= 0;
|
||||
|
||||
strncpy(str, sfile->dir, FILE_MAXDIR-1);
|
||||
if(index<0)
|
||||
strncat(str, sfile->file, FILE_MAXDIR-1);
|
||||
else
|
||||
strncat(str, sfile->filelist[index].relname, FILE_MAXDIR-1);
|
||||
|
||||
/* is it a movie? */
|
||||
anim = openanim(str, IB_rect);
|
||||
if(anim==0) {
|
||||
error("The selected file is not a movie or "
|
||||
"FFMPEG-support not compiled in!");
|
||||
return(cfra);
|
||||
}
|
||||
|
||||
totframe= IMB_anim_get_duration(anim);
|
||||
|
||||
/* make seq */
|
||||
seq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
seq->len= totframe;
|
||||
seq->type= SEQ_MOVIE;
|
||||
seq->anim= anim;
|
||||
seq->anim_preseek = IMB_anim_get_preseek(anim);
|
||||
|
||||
calc_sequence(seq);
|
||||
|
||||
if(sfile->flag & FILE_STRINGCODE) {
|
||||
strcpy(name, sfile->dir);
|
||||
BLI_makestringcode(G.sce, name);
|
||||
} else {
|
||||
strcpy(name, sfile->dir);
|
||||
}
|
||||
|
||||
/* strip and stripdata */
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len= totframe;
|
||||
strip->us= 1;
|
||||
strncpy(strip->dir, name, FILE_MAXDIR-1);
|
||||
strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
|
||||
|
||||
/* name movie in first strip */
|
||||
if(index<0)
|
||||
strncpy(se->name, sfile->file, FILE_MAXFILE-1);
|
||||
else
|
||||
strncpy(se->name, sfile->filelist[index].relname, FILE_MAXFILE-1);
|
||||
|
||||
/* last active name */
|
||||
strncpy(ed->act_imagedir, seq->strip->dir, FILE_MAXDIR-1);
|
||||
return(cfra+totframe);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void sfile_to_mv_sequence(SpaceFile *sfile, int cfra, int machine)
|
||||
{
|
||||
#if 0
|
||||
/* XXX sfile recoded... */
|
||||
int a, totsel;
|
||||
|
||||
totsel= 0;
|
||||
for(a= 0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if ((sfile->filelist[a].type & S_IFDIR)==0) {
|
||||
totsel++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if((totsel==0) && (sfile->file[0])) {
|
||||
cfra= sfile_to_mv_sequence_load(sfile, cfra, machine, -1);
|
||||
return;
|
||||
}
|
||||
|
||||
if(totsel==0) return;
|
||||
|
||||
/* ok. check all the select file, and load it. */
|
||||
for(a= 0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if ((sfile->filelist[a].type & S_IFDIR)==0) {
|
||||
/* load and update current frame. */
|
||||
cfra= sfile_to_mv_sequence_load(sfile, cfra, machine, a);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static Sequence *sfile_to_ramsnd_sequence(Scene *scene, SpaceFile *sfile, int cfra, int machine)
|
||||
{
|
||||
#if 0
|
||||
/* XXX sfile recoded... */
|
||||
Sequence *seq;
|
||||
bSound *sound;
|
||||
Strip *strip;
|
||||
StripElem *se;
|
||||
double totframe;
|
||||
char name[160];
|
||||
char str[256];
|
||||
|
||||
totframe= 0.0;
|
||||
|
||||
strncpy(str, sfile->dir, FILE_MAXDIR-1);
|
||||
strncat(str, sfile->file, FILE_MAXFILE-1);
|
||||
|
||||
sound= sound_new_sound(str);
|
||||
if (!sound || sound->sample->type == SAMPLE_INVALID) {
|
||||
error("Unsupported audio format");
|
||||
return 0;
|
||||
}
|
||||
if (sound->sample->bits != 16) {
|
||||
error("Only 16 bit audio is supported");
|
||||
return 0;
|
||||
}
|
||||
sound->id.us=1;
|
||||
sound->flags |= SOUND_FLAGS_SEQUENCE;
|
||||
audio_makestream(sound);
|
||||
|
||||
totframe= (int) ( ((float)(sound->streamlen-1)/
|
||||
( (float)scene->r.audio.mixrate*4.0 ))* FPS);
|
||||
|
||||
/* make seq */
|
||||
seq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
seq->len= totframe;
|
||||
seq->type= SEQ_RAM_SOUND;
|
||||
seq->sound = sound;
|
||||
|
||||
calc_sequence(seq);
|
||||
|
||||
if(sfile->flag & FILE_STRINGCODE) {
|
||||
strcpy(name, sfile->dir);
|
||||
BLI_makestringcode(G.sce, name);
|
||||
} else {
|
||||
strcpy(name, sfile->dir);
|
||||
}
|
||||
|
||||
/* strip and stripdata */
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len= totframe;
|
||||
strip->us= 1;
|
||||
strncpy(strip->dir, name, FILE_MAXDIR-1);
|
||||
strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
|
||||
|
||||
/* name sound in first strip */
|
||||
strncpy(se->name, sfile->file, FILE_MAXFILE-1);
|
||||
|
||||
/* last active name */
|
||||
strncpy(ed->act_sounddir, seq->strip->dir, FILE_MAXDIR-1);
|
||||
|
||||
return seq;
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int sfile_to_hdsnd_sequence_load(SpaceFile *sfile, int cfra,
|
||||
int machine, int index)
|
||||
{
|
||||
/* XXX sfile recoded... */
|
||||
Sequence *seq;
|
||||
struct hdaudio *hdaudio;
|
||||
Strip *strip;
|
||||
StripElem *se;
|
||||
int totframe;
|
||||
char name[160];
|
||||
char str[FILE_MAXDIR+FILE_MAXFILE];
|
||||
|
||||
totframe= 0;
|
||||
|
||||
strncpy(str, sfile->dir, FILE_MAXDIR-1);
|
||||
if(index<0)
|
||||
strncat(str, sfile->file, FILE_MAXDIR-1);
|
||||
else
|
||||
strncat(str, sfile->filelist[index].relname, FILE_MAXDIR-1);
|
||||
|
||||
/* is it a sound file? */
|
||||
hdaudio = sound_open_hdaudio(str);
|
||||
if(hdaudio==0) {
|
||||
error("The selected file is not a sound file or "
|
||||
"FFMPEG-support not compiled in!");
|
||||
return(cfra);
|
||||
}
|
||||
|
||||
totframe= sound_hdaudio_get_duration(hdaudio, FPS);
|
||||
|
||||
/* make seq */
|
||||
seq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
seq->len= totframe;
|
||||
seq->type= SEQ_HD_SOUND;
|
||||
seq->hdaudio= hdaudio;
|
||||
|
||||
calc_sequence(seq);
|
||||
|
||||
if(sfile->flag & FILE_STRINGCODE) {
|
||||
strcpy(name, sfile->dir);
|
||||
BLI_makestringcode(G.sce, name);
|
||||
} else {
|
||||
strcpy(name, sfile->dir);
|
||||
}
|
||||
|
||||
/* strip and stripdata */
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len= totframe;
|
||||
strip->us= 1;
|
||||
strncpy(strip->dir, name, FILE_MAXDIR-1);
|
||||
strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
|
||||
|
||||
/* name movie in first strip */
|
||||
if(index<0)
|
||||
strncpy(se->name, sfile->file, FILE_MAXFILE-1);
|
||||
else
|
||||
strncpy(se->name, sfile->filelist[index].relname, FILE_MAXFILE-1);
|
||||
|
||||
/* last active name */
|
||||
strncpy(ed->act_sounddir, seq->strip->dir, FILE_MAXDIR-1);
|
||||
return(cfra+totframe);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void sfile_to_hdsnd_sequence(SpaceFile *sfile, int cfra, int machine)
|
||||
{
|
||||
#if 0
|
||||
/* XXX sfile recoded... */
|
||||
int totsel, a;
|
||||
|
||||
totsel= 0;
|
||||
for(a= 0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if((sfile->filelist[a].type & S_IFDIR)==0) {
|
||||
totsel++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if((totsel==0) && (sfile->file[0])) {
|
||||
cfra= sfile_to_hdsnd_sequence_load(sfile, cfra, machine, -1);
|
||||
return;
|
||||
}
|
||||
|
||||
if(totsel==0) return;
|
||||
|
||||
/* ok, check all the select file, and load it. */
|
||||
for(a= 0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if((sfile->filelist[a].type & S_IFDIR)==0) {
|
||||
/* load and update current frame. */
|
||||
cfra= sfile_to_hdsnd_sequence_load(sfile, cfra, machine, a);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void add_image_strips(Scene *scene, char *name)
|
||||
{
|
||||
#if 0
|
||||
/* XXX sfile recoded... */
|
||||
|
||||
SpaceFile *sfile;
|
||||
struct direntry *files;
|
||||
float x, y;
|
||||
int a, totfile, cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
/* restore windowmatrices */
|
||||
// XXX drawseqspace(curarea, curarea->spacedata.first);
|
||||
|
||||
/* search sfile */
|
||||
// sfile= scrarea_find_space_of_type(curarea, SPACE_FILE);
|
||||
if(sfile==0) return;
|
||||
|
||||
/* where will it be */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
/* also read contents of directories */
|
||||
files= sfile->filelist;
|
||||
totfile= sfile->totfile;
|
||||
sfile->filelist= 0;
|
||||
sfile->totfile= 0;
|
||||
|
||||
for(a=0; a<totfile; a++) {
|
||||
if(files[a].flags & ACTIVE) {
|
||||
if( (files[a].type & S_IFDIR) ) {
|
||||
strncat(sfile->dir, files[a].relname, FILE_MAXFILE-1);
|
||||
strcat(sfile->dir,"/");
|
||||
read_dir(sfile);
|
||||
|
||||
/* select all */
|
||||
swapselect_file(sfile);
|
||||
|
||||
if ( sfile_to_sequence(scene, sfile, cfra, machine, 0) ) machine++;
|
||||
|
||||
parent(sfile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sfile->filelist= files;
|
||||
sfile->totfile= totfile;
|
||||
|
||||
/* read directory itself */
|
||||
sfile_to_sequence(scene, sfile, cfra, machine, 1);
|
||||
|
||||
waitcursor(0);
|
||||
|
||||
BIF_undo_push("Add Image Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void add_movie_strip(Scene *scene, View2D *v2d, char *name)
|
||||
{
|
||||
|
||||
/* XXX sfile recoded... */
|
||||
SpaceFile *sfile;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
/* restore windowmatrices */
|
||||
// drawseqspace(curarea, curarea->spacedata.first);
|
||||
|
||||
/* search sfile */
|
||||
// sfile= scrarea_find_space_of_type(curarea, SPACE_FILE);
|
||||
if(sfile==0) return;
|
||||
|
||||
/* where will it be */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
/* read directory itself */
|
||||
sfile_to_mv_sequence(sfile, cfra, machine);
|
||||
|
||||
waitcursor(0);
|
||||
|
||||
BIF_undo_push("Add Movie Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
|
||||
}
|
||||
|
||||
static void add_movie_and_hdaudio_strip(Scene *scene, View2D *v2d, char *name)
|
||||
{
|
||||
SpaceFile *sfile;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
/* restore windowmatrices */
|
||||
// areawinset(curarea->win);
|
||||
// drawseqspace(curarea, curarea->spacedata.first);
|
||||
|
||||
/* search sfile */
|
||||
// sfile= scrarea_find_space_of_type(curarea, SPACE_FILE);
|
||||
if(sfile==0) return;
|
||||
|
||||
/* where will it be */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
/* read directory itself */
|
||||
sfile_to_hdsnd_sequence(sfile, cfra, machine);
|
||||
sfile_to_mv_sequence(sfile, cfra, machine);
|
||||
|
||||
waitcursor(0);
|
||||
|
||||
BIF_undo_push("Add Movie and HD-Audio Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
|
||||
}
|
||||
|
||||
static void add_sound_strip_ram(Scene *scene, View2D *v2d, char *name)
|
||||
{
|
||||
SpaceFile *sfile;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
// sfile= scrarea_find_space_of_type(curarea, SPACE_FILE);
|
||||
if (sfile==0) return;
|
||||
|
||||
/* where will it be */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
sfile_to_ramsnd_sequence(scene, sfile, cfra, machine);
|
||||
|
||||
waitcursor(0);
|
||||
|
||||
BIF_undo_push("Add Sound (RAM) Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
}
|
||||
|
||||
static void add_sound_strip_hd(Scene *scene, View2D *v2d, char *name)
|
||||
{
|
||||
SpaceFile *sfile;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
// sfile= scrarea_find_space_of_type(curarea, SPACE_FILE);
|
||||
if (sfile==0) return;
|
||||
|
||||
/* where will it be */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
sfile_to_hdsnd_sequence(sfile, cfra, machine);
|
||||
|
||||
waitcursor(0);
|
||||
|
||||
BIF_undo_push("Add Sound (HD) Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
}
|
||||
|
||||
static void add_scene_strip(Scene *scene, View2D *v2d, short event)
|
||||
{
|
||||
Sequence *seq;
|
||||
Strip *strip;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
if(event> -1) {
|
||||
int nr= 1;
|
||||
Scene * sce= G.main->scene.first;
|
||||
while(sce) {
|
||||
if( event==nr) break;
|
||||
nr++;
|
||||
sce= sce->id.next;
|
||||
}
|
||||
if(sce) {
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
/* where ? */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
seq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
seq->type= SEQ_SCENE;
|
||||
seq->scene= sce;
|
||||
seq->sfra= sce->r.sfra;
|
||||
seq->len= sce->r.efra - sce->r.sfra + 1;
|
||||
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strncpy(seq->name + 2, sce->id.name + 2,
|
||||
sizeof(seq->name) - 2);
|
||||
strip->len= seq->len;
|
||||
strip->us= 1;
|
||||
|
||||
BIF_undo_push("Add Scene Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int add_seq_effect(Scene *scene, View2D *v2d, int type, char *str)
|
||||
{
|
||||
Editing *ed;
|
||||
Sequence *newseq, *seq1, *seq2, *seq3;
|
||||
Strip *strip;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
struct SeqEffectHandle sh;
|
||||
|
||||
if(scene->ed==NULL) return 0;
|
||||
ed= scene->ed;
|
||||
|
||||
if(!seq_effect_find_selected(scene, NULL, event_to_efftype(type), &seq1, &seq2, &seq3))
|
||||
return 0;
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
/* where will it be (cfra is not realy needed) */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
/* allocate and initialize */
|
||||
newseq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
newseq->type= event_to_efftype(type);
|
||||
|
||||
sh = get_sequence_effect(newseq);
|
||||
|
||||
newseq->seq1= seq1;
|
||||
newseq->seq2= seq2;
|
||||
newseq->seq3= seq3;
|
||||
|
||||
sh.init(newseq);
|
||||
|
||||
if (!seq1) {
|
||||
newseq->len= 1;
|
||||
newseq->startstill= 25;
|
||||
newseq->endstill= 24;
|
||||
}
|
||||
|
||||
calc_sequence(newseq);
|
||||
|
||||
newseq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len= newseq->len;
|
||||
strip->us= 1;
|
||||
if(newseq->len>0)
|
||||
strip->stripdata= MEM_callocN(newseq->len*sizeof(StripElem), "stripelem");
|
||||
|
||||
/* initialize plugin */
|
||||
if(newseq->type == SEQ_PLUGIN) {
|
||||
sh.init_plugin(newseq, str);
|
||||
|
||||
if(newseq->plugin==0) {
|
||||
BLI_remlink(ed->seqbasep, newseq);
|
||||
seq_free_sequence(newseq);
|
||||
set_last_seq(scene, NULL);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* set find a free spot to but the strip */
|
||||
if (newseq->seq1) {
|
||||
newseq->machine= MAX3(newseq->seq1->machine,
|
||||
newseq->seq2->machine,
|
||||
newseq->seq3->machine);
|
||||
}
|
||||
if(test_overlap_seq(scene, newseq)) shuffle_seq(scene, newseq);
|
||||
|
||||
update_changed_seq_and_deps(scene, newseq, 1, 1);
|
||||
|
||||
/* push undo and go into grab mode */
|
||||
if(newseq->type == SEQ_PLUGIN) {
|
||||
BIF_undo_push("Add Plugin Strip, Sequencer");
|
||||
} else {
|
||||
BIF_undo_push("Add Effect Strip, Sequencer");
|
||||
}
|
||||
|
||||
transform_seq_nomarker('g', 0);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void load_plugin_seq(Scene *scene, View2D *v2d, char *str) /* called from fileselect */
|
||||
{
|
||||
add_seq_effect(scene, v2d, 10, str);
|
||||
}
|
||||
|
||||
void add_sequence(Scene *scene, View2D *v2d, int type)
|
||||
{
|
||||
Editing *ed= scene->ed;
|
||||
short event;
|
||||
char *str;
|
||||
|
||||
if (type >= 0){
|
||||
/* bypass pupmenu for calls from menus (aphex) */
|
||||
switch(type){
|
||||
case SEQ_SCENE:
|
||||
event = 101;
|
||||
break;
|
||||
case SEQ_IMAGE:
|
||||
event = 1;
|
||||
break;
|
||||
case SEQ_MOVIE:
|
||||
event = 102;
|
||||
break;
|
||||
case SEQ_RAM_SOUND:
|
||||
event = 103;
|
||||
break;
|
||||
case SEQ_HD_SOUND:
|
||||
event = 104;
|
||||
break;
|
||||
case SEQ_MOVIE_AND_HD_SOUND:
|
||||
event = 105;
|
||||
break;
|
||||
case SEQ_PLUGIN:
|
||||
event = 10;
|
||||
break;
|
||||
case SEQ_CROSS:
|
||||
event = 2;
|
||||
break;
|
||||
case SEQ_ADD:
|
||||
event = 4;
|
||||
break;
|
||||
case SEQ_SUB:
|
||||
event = 5;
|
||||
break;
|
||||
case SEQ_ALPHAOVER:
|
||||
event = 7;
|
||||
break;
|
||||
case SEQ_ALPHAUNDER:
|
||||
event = 8;
|
||||
break;
|
||||
case SEQ_GAMCROSS:
|
||||
event = 3;
|
||||
break;
|
||||
case SEQ_MUL:
|
||||
event = 6;
|
||||
break;
|
||||
case SEQ_OVERDROP:
|
||||
event = 9;
|
||||
break;
|
||||
case SEQ_WIPE:
|
||||
event = 13;
|
||||
break;
|
||||
case SEQ_GLOW:
|
||||
event = 14;
|
||||
break;
|
||||
case SEQ_TRANSFORM:
|
||||
event = 15;
|
||||
break;
|
||||
case SEQ_COLOR:
|
||||
event = 16;
|
||||
break;
|
||||
case SEQ_SPEED:
|
||||
event = 17;
|
||||
break;
|
||||
default:
|
||||
event = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
event= pupmenu("Add Sequence Strip%t"
|
||||
"|Image Sequence%x1"
|
||||
"|Movie%x102"
|
||||
#ifdef WITH_FFMPEG
|
||||
"|Movie + Audio (HD)%x105"
|
||||
"|Audio (RAM)%x103"
|
||||
"|Audio (HD)%x104"
|
||||
#else
|
||||
"|Audio (Wav)%x103"
|
||||
#endif
|
||||
"|Scene%x101"
|
||||
"|Plugin%x10"
|
||||
"|Cross%x2"
|
||||
"|Gamma Cross%x3"
|
||||
"|Add%x4"
|
||||
"|Sub%x5"
|
||||
"|Mul%x6"
|
||||
"|Alpha Over%x7"
|
||||
"|Alpha Under%x8"
|
||||
"|Alpha Over Drop%x9"
|
||||
"|Wipe%x13"
|
||||
"|Glow%x14"
|
||||
"|Transforms%x15"
|
||||
"|Color Generator%x16"
|
||||
"|Speed Control%x17");
|
||||
}
|
||||
|
||||
if(event<1) return;
|
||||
|
||||
if(scene->ed==NULL) {
|
||||
ed= scene->ed= MEM_callocN( sizeof(Editing), "addseq");
|
||||
ed->seqbasep= &ed->seqbase;
|
||||
}
|
||||
|
||||
switch(event) {
|
||||
case 1:
|
||||
/* Image Dosnt work at the moment - TODO */
|
||||
//if(G.qual & LR_CTRLKEY)
|
||||
// activate_imageselect(FILE_SPECIAL, "Select Images", ed->act_imagedir, add_image_strips);
|
||||
//else
|
||||
activate_fileselect(FILE_SPECIAL, "Select Images", ed->act_imagedir, add_image_strips);
|
||||
break;
|
||||
case 105:
|
||||
activate_fileselect(FILE_SPECIAL, "Select Movie+Audio", ed->act_imagedir, add_movie_and_hdaudio_strip);
|
||||
break;
|
||||
case 102:
|
||||
|
||||
activate_fileselect(FILE_SPECIAL, "Select Movie", ed->act_imagedir, add_movie_strip);
|
||||
break;
|
||||
case 101:
|
||||
/* new menu: */
|
||||
IDnames_to_pupstring(&str, NULL, NULL, &G.main->scene, (ID *)scene, NULL);
|
||||
|
||||
add_scene_strip(scene, v2d, pupmenu_col(str, 20));
|
||||
|
||||
MEM_freeN(str);
|
||||
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
case 13:
|
||||
case 14:
|
||||
case 15:
|
||||
case 16:
|
||||
case 17:
|
||||
if(get_last_seq(scene)==0 &&
|
||||
get_sequence_effect_num_inputs( event_to_efftype(event))> 0)
|
||||
error("Need at least one active sequence strip");
|
||||
else if(event==10)
|
||||
activate_fileselect(FILE_SPECIAL, "Select Plugin", U.plugseqdir, load_plugin_seq);
|
||||
else
|
||||
add_seq_effect(scene, v2d, event, NULL);
|
||||
|
||||
break;
|
||||
case 103:
|
||||
if (ed->act_sounddir[0]=='\0') strncpy(ed->act_sounddir, U.sounddir, FILE_MAXDIR-1);
|
||||
activate_fileselect(FILE_SPECIAL, "Select Audio (RAM)", ed->act_sounddir, add_sound_strip_ram);
|
||||
break;
|
||||
case 104:
|
||||
if (ed->act_sounddir[0]=='\0') strncpy(ed->act_sounddir, U.sounddir, FILE_MAXDIR-1);
|
||||
activate_fileselect(FILE_SPECIAL, "Select Audio (HD)", ed->act_sounddir, add_sound_strip_hd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static const char sequencer_add_name_doc[] = "Name of the new sequence strip";
|
||||
static const char sequencer_add_start_frame_doc[] = "Start frame of the sequence strip";
|
||||
static const char sequencer_add_end_frame_doc[] = "End frame for the color strip";
|
||||
static const char sequencer_add_channel_doc[] = "Channel to place this strip into";
|
||||
|
||||
|
||||
|
||||
static int sequencer_add_color_strip_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
Editing *ed= scene->ed;
|
||||
|
||||
|
||||
Sequence *seq; /* generic strip vars */
|
||||
Strip *strip;
|
||||
StripElem *se;
|
||||
|
||||
SolidColorVars *colvars; /* type spesific vars */
|
||||
|
||||
int start_frame, end_frame, channel; /* operator props */
|
||||
|
||||
start_frame= RNA_int_get(op->ptr, "start_frame");
|
||||
end_frame= RNA_int_get(op->ptr, "end_frame");
|
||||
channel= RNA_int_get(op->ptr, "channel");
|
||||
|
||||
if (end_frame <= start_frame) /* XXX use error reporter for bad frame values? */
|
||||
end_frame= start_frame+1;
|
||||
|
||||
seq = alloc_sequence(ed->seqbasep, start_frame, channel); /* warning, this sets last */
|
||||
|
||||
seq->effectdata = MEM_callocN(sizeof(struct SolidColorVars), "solidcolor");
|
||||
colvars= (SolidColorVars *)seq->effectdata;
|
||||
|
||||
seq->type= SEQ_COLOR;
|
||||
|
||||
/* basic defaults */
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len = seq->len = end_frame-start_frame; /* Color strips are different in that they can be any length */
|
||||
strip->us= 1;
|
||||
|
||||
strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
|
||||
|
||||
RNA_string_get(op->ptr, "name", seq->name);
|
||||
RNA_float_get_array(op->ptr, "color", colvars->col);
|
||||
|
||||
calc_sequence_disp(seq);
|
||||
sort_seq(scene);
|
||||
|
||||
ED_undo_push(C, "Add Color Strip, Sequencer");
|
||||
ED_area_tag_redraw(CTX_wm_area(C));
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
|
||||
/* add color */
|
||||
static int sequencer_add_color_strip_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
{
|
||||
|
||||
ARegion *ar= CTX_wm_region(C);
|
||||
View2D *v2d= UI_view2d_fromcontext(C);
|
||||
|
||||
short mval[2];
|
||||
float mval_v2d[2];
|
||||
|
||||
int start_frame, end_frame, channel;
|
||||
|
||||
mval[0]= event->x - ar->winrct.xmin;
|
||||
mval[1]= event->y - ar->winrct.ymin;
|
||||
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &mval_v2d[0], &mval_v2d[1]);
|
||||
|
||||
start_frame= (int)mval_v2d[0];
|
||||
end_frame= start_frame+25;
|
||||
channel= (int)mval_v2d[1]+0.5f;
|
||||
|
||||
RNA_int_set(op->ptr, "start_frame", start_frame);
|
||||
RNA_int_set(op->ptr, "end_frame", end_frame);
|
||||
RNA_int_set(op->ptr, "channel", channel);
|
||||
|
||||
/* color can be left default */
|
||||
|
||||
return sequencer_add_color_strip_exec(C, op);
|
||||
}
|
||||
|
||||
|
||||
void SEQUENCER_OT_add_color_strip(struct wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
ot->name= "Add Color Strip";
|
||||
ot->idname= "SEQUENCER_OT_add_color_strip";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= sequencer_add_color_strip_invoke;
|
||||
ot->exec= sequencer_add_color_strip_exec;
|
||||
|
||||
ot->poll= ED_operator_sequencer_active;
|
||||
ot->flag= OPTYPE_REGISTER;
|
||||
|
||||
RNA_def_string(ot->srna, "name", "", MAX_ID_NAME-2, "Name", sequencer_add_name_doc);
|
||||
RNA_def_int(ot->srna, "start_frame", 0, INT_MIN, INT_MAX, "Start Frame", sequencer_add_start_frame_doc, INT_MIN, INT_MAX);
|
||||
RNA_def_int(ot->srna, "end_frame", 0, INT_MIN, INT_MAX, "End Frame", sequencer_add_end_frame_doc, INT_MIN, INT_MAX); /* not useual since most strips have a fixed length */
|
||||
RNA_def_int(ot->srna, "channel", 1, 1, MAXSEQ, "Channel", sequencer_add_channel_doc, 1, MAXSEQ);
|
||||
RNA_def_float_vector(ot->srna, "color", 3, NULL, 0.0f, 1.0f, "Color", "Initialize the strip with this color", 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
|
||||
/* add scene operator */
|
||||
static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
Editing *ed= scene->ed;
|
||||
|
||||
Scene *sce_seq;
|
||||
char sce_name[MAX_ID_NAME-2];
|
||||
|
||||
Sequence *seq; /* generic strip vars */
|
||||
Strip *strip;
|
||||
StripElem *se;
|
||||
|
||||
int start_frame, channel; /* operator props */
|
||||
|
||||
start_frame= RNA_int_get(op->ptr, "start_frame");
|
||||
channel= RNA_int_get(op->ptr, "channel");
|
||||
|
||||
RNA_string_get(op->ptr, "scene", sce_name);
|
||||
|
||||
for(sce_seq= CTX_data_main(C)->scene.first; sce_seq; sce_seq= sce_seq->id.next)
|
||||
if (strcmp(sce_seq->id.name+2, sce_name)==0)
|
||||
break;
|
||||
|
||||
if (sce_seq==NULL) {
|
||||
BKE_reportf(op->reports, RPT_ERROR, "Scene \"%s\" not found", sce_name);
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
seq = alloc_sequence(ed->seqbasep, start_frame, channel); /* warning, this sets last */
|
||||
|
||||
seq->type= SEQ_SCENE;
|
||||
seq->scene= sce_seq;
|
||||
|
||||
/* basic defaults */
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len = seq->len = sce_seq->r.efra - sce_seq->r.sfra + 1;
|
||||
strip->us= 1;
|
||||
|
||||
strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
|
||||
|
||||
|
||||
RNA_string_get(op->ptr, "name", seq->name);
|
||||
|
||||
calc_sequence_disp(seq);
|
||||
sort_seq(scene);
|
||||
|
||||
ED_undo_push(C, "Add Scene Strip, Sequencer");
|
||||
ED_area_tag_redraw(CTX_wm_area(C));
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
|
||||
static int sequencer_add_scene_strip_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
ARegion *ar= CTX_wm_region(C);
|
||||
View2D *v2d= UI_view2d_fromcontext(C);
|
||||
|
||||
short mval[2];
|
||||
float mval_v2d[2];
|
||||
|
||||
int start_frame, channel;
|
||||
|
||||
mval[0]= event->x - ar->winrct.xmin;
|
||||
mval[1]= event->y - ar->winrct.ymin;
|
||||
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &mval_v2d[0], &mval_v2d[1]);
|
||||
|
||||
start_frame= (int)mval_v2d[0];
|
||||
channel= (int)mval_v2d[1]+0.5f;
|
||||
|
||||
|
||||
RNA_int_set(op->ptr, "start_frame", start_frame);
|
||||
RNA_int_set(op->ptr, "channel", channel);
|
||||
|
||||
/* scene can be left default */
|
||||
RNA_string_set(op->ptr, "scene", "Scene"); // XXX should popup a menu but ton says 2.5 will have some better feature for this
|
||||
|
||||
|
||||
return sequencer_add_scene_strip_exec(C, op);
|
||||
}
|
||||
|
||||
|
||||
void SEQUENCER_OT_add_scene_strip(struct wmOperatorType *ot)
|
||||
{
|
||||
|
||||
/* identifiers */
|
||||
ot->name= "Add Scene Strip";
|
||||
ot->idname= "SEQUENCER_OT_add_scene_strip";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke= sequencer_add_scene_strip_invoke;
|
||||
ot->exec= sequencer_add_scene_strip_exec;
|
||||
|
||||
ot->poll= ED_operator_sequencer_active;
|
||||
ot->flag= OPTYPE_REGISTER;
|
||||
|
||||
RNA_def_string(ot->srna, "name", "", MAX_ID_NAME-2, "Name", sequencer_add_name_doc);
|
||||
RNA_def_int(ot->srna, "start_frame", 0, INT_MIN, INT_MAX, "Start Frame", sequencer_add_start_frame_doc, INT_MIN, INT_MAX);
|
||||
RNA_def_int(ot->srna, "channel", 1, 1, MAXSEQ, "Channel", sequencer_add_channel_doc, 1, MAXSEQ);
|
||||
RNA_def_string(ot->srna, "scene", "", MAX_ID_NAME-2, "Scene Name", "Scene name to add as a strip");
|
||||
}
|
||||
|
||||
@@ -526,7 +526,6 @@ Sequence *find_nearest_seq(Scene *scene, View2D *v2d, int *hand, short mval[2])
|
||||
Sequence *seq;
|
||||
Editing *ed;
|
||||
float x, y;
|
||||
// short mval[2];
|
||||
float pixelx;
|
||||
float handsize;
|
||||
float displen;
|
||||
@@ -537,7 +536,6 @@ Sequence *find_nearest_seq(Scene *scene, View2D *v2d, int *hand, short mval[2])
|
||||
|
||||
pixelx = (v2d->cur.xmax - v2d->cur.xmin)/(v2d->mask.xmax - v2d->mask.xmin);
|
||||
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
|
||||
seq= ed->seqbasep->first;
|
||||
@@ -702,582 +700,23 @@ Sequence *alloc_sequence(ListBase *lb, int cfra, int machine)
|
||||
return seq;
|
||||
}
|
||||
|
||||
static Sequence *sfile_to_sequence(Scene *scene, SpaceFile *sfile, int cfra, int machine, int last)
|
||||
int event_to_efftype(int event)
|
||||
{
|
||||
#if 0
|
||||
/* XXX sfile recoded... */
|
||||
Sequence *seq;
|
||||
Strip *strip;
|
||||
StripElem *se;
|
||||
int totsel, a;
|
||||
char name[160];
|
||||
Editing *ed= scene->ed;
|
||||
|
||||
/* are there selected files? */
|
||||
totsel= 0;
|
||||
for(a=0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if( (sfile->filelist[a].type & S_IFDIR)==0 ) {
|
||||
totsel++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(last) {
|
||||
/* if not, a file handed to us? */
|
||||
if(totsel==0 && sfile->file[0]) totsel= 1;
|
||||
}
|
||||
|
||||
if(totsel==0) return 0;
|
||||
|
||||
/* make seq */
|
||||
seq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
seq->len= totsel;
|
||||
|
||||
if(totsel==1) {
|
||||
seq->startstill= 25;
|
||||
seq->endstill= 24;
|
||||
}
|
||||
|
||||
calc_sequence(seq);
|
||||
|
||||
if(sfile->flag & FILE_STRINGCODE) {
|
||||
strcpy(name, sfile->dir);
|
||||
BLI_makestringcode(G.sce, name);
|
||||
} else {
|
||||
strcpy(name, sfile->dir);
|
||||
}
|
||||
|
||||
/* strip and stripdata */
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len= totsel;
|
||||
strip->us= 1;
|
||||
strncpy(strip->dir, name, FILE_MAXDIR-1);
|
||||
strip->stripdata= se= MEM_callocN(totsel*sizeof(StripElem), "stripelem");
|
||||
|
||||
for(a=0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if( (sfile->filelist[a].type & S_IFDIR)==0 ) {
|
||||
strncpy(se->name, sfile->filelist[a].relname, FILE_MAXFILE-1);
|
||||
se++;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* no selected file: */
|
||||
if(totsel==1 && se==strip->stripdata) {
|
||||
strncpy(se->name, sfile->file, FILE_MAXFILE-1);
|
||||
}
|
||||
|
||||
/* last active name */
|
||||
strncpy(ed->act_imagedir, seq->strip->dir, FILE_MAXDIR-1);
|
||||
|
||||
return seq;
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
static int sfile_to_mv_sequence_load(Scene *scene, SpaceFile *sfile, int cfra,
|
||||
int machine, int index )
|
||||
{
|
||||
/* XXX sfile recoded... */
|
||||
Sequence *seq;
|
||||
struct anim *anim;
|
||||
Strip *strip;
|
||||
StripElem *se;
|
||||
int totframe;
|
||||
char name[160];
|
||||
char str[FILE_MAXDIR+FILE_MAXFILE];
|
||||
Editing *ed= scene->ed;
|
||||
|
||||
totframe= 0;
|
||||
|
||||
strncpy(str, sfile->dir, FILE_MAXDIR-1);
|
||||
if(index<0)
|
||||
strncat(str, sfile->file, FILE_MAXDIR-1);
|
||||
else
|
||||
strncat(str, sfile->filelist[index].relname, FILE_MAXDIR-1);
|
||||
|
||||
/* is it a movie? */
|
||||
anim = openanim(str, IB_rect);
|
||||
if(anim==0) {
|
||||
error("The selected file is not a movie or "
|
||||
"FFMPEG-support not compiled in!");
|
||||
return(cfra);
|
||||
}
|
||||
|
||||
totframe= IMB_anim_get_duration(anim);
|
||||
|
||||
/* make seq */
|
||||
seq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
seq->len= totframe;
|
||||
seq->type= SEQ_MOVIE;
|
||||
seq->anim= anim;
|
||||
seq->anim_preseek = IMB_anim_get_preseek(anim);
|
||||
|
||||
calc_sequence(seq);
|
||||
|
||||
if(sfile->flag & FILE_STRINGCODE) {
|
||||
strcpy(name, sfile->dir);
|
||||
BLI_makestringcode(G.sce, name);
|
||||
} else {
|
||||
strcpy(name, sfile->dir);
|
||||
}
|
||||
|
||||
/* strip and stripdata */
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len= totframe;
|
||||
strip->us= 1;
|
||||
strncpy(strip->dir, name, FILE_MAXDIR-1);
|
||||
strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
|
||||
|
||||
/* name movie in first strip */
|
||||
if(index<0)
|
||||
strncpy(se->name, sfile->file, FILE_MAXFILE-1);
|
||||
else
|
||||
strncpy(se->name, sfile->filelist[index].relname, FILE_MAXFILE-1);
|
||||
|
||||
/* last active name */
|
||||
strncpy(ed->act_imagedir, seq->strip->dir, FILE_MAXDIR-1);
|
||||
return(cfra+totframe);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void sfile_to_mv_sequence(SpaceFile *sfile, int cfra, int machine)
|
||||
{
|
||||
#if 0
|
||||
/* XXX sfile recoded... */
|
||||
int a, totsel;
|
||||
|
||||
totsel= 0;
|
||||
for(a= 0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if ((sfile->filelist[a].type & S_IFDIR)==0) {
|
||||
totsel++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if((totsel==0) && (sfile->file[0])) {
|
||||
cfra= sfile_to_mv_sequence_load(sfile, cfra, machine, -1);
|
||||
return;
|
||||
}
|
||||
|
||||
if(totsel==0) return;
|
||||
|
||||
/* ok. check all the select file, and load it. */
|
||||
for(a= 0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if ((sfile->filelist[a].type & S_IFDIR)==0) {
|
||||
/* load and update current frame. */
|
||||
cfra= sfile_to_mv_sequence_load(sfile, cfra, machine, a);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static Sequence *sfile_to_ramsnd_sequence(Scene *scene, SpaceFile *sfile, int cfra, int machine)
|
||||
{
|
||||
#if 0
|
||||
/* XXX sfile recoded... */
|
||||
Sequence *seq;
|
||||
bSound *sound;
|
||||
Strip *strip;
|
||||
StripElem *se;
|
||||
double totframe;
|
||||
char name[160];
|
||||
char str[256];
|
||||
|
||||
totframe= 0.0;
|
||||
|
||||
strncpy(str, sfile->dir, FILE_MAXDIR-1);
|
||||
strncat(str, sfile->file, FILE_MAXFILE-1);
|
||||
|
||||
sound= sound_new_sound(str);
|
||||
if (!sound || sound->sample->type == SAMPLE_INVALID) {
|
||||
error("Unsupported audio format");
|
||||
return 0;
|
||||
}
|
||||
if (sound->sample->bits != 16) {
|
||||
error("Only 16 bit audio is supported");
|
||||
return 0;
|
||||
}
|
||||
sound->id.us=1;
|
||||
sound->flags |= SOUND_FLAGS_SEQUENCE;
|
||||
audio_makestream(sound);
|
||||
|
||||
totframe= (int) ( ((float)(sound->streamlen-1)/
|
||||
( (float)scene->r.audio.mixrate*4.0 ))* FPS);
|
||||
|
||||
/* make seq */
|
||||
seq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
seq->len= totframe;
|
||||
seq->type= SEQ_RAM_SOUND;
|
||||
seq->sound = sound;
|
||||
|
||||
calc_sequence(seq);
|
||||
|
||||
if(sfile->flag & FILE_STRINGCODE) {
|
||||
strcpy(name, sfile->dir);
|
||||
BLI_makestringcode(G.sce, name);
|
||||
} else {
|
||||
strcpy(name, sfile->dir);
|
||||
}
|
||||
|
||||
/* strip and stripdata */
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len= totframe;
|
||||
strip->us= 1;
|
||||
strncpy(strip->dir, name, FILE_MAXDIR-1);
|
||||
strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
|
||||
|
||||
/* name sound in first strip */
|
||||
strncpy(se->name, sfile->file, FILE_MAXFILE-1);
|
||||
|
||||
/* last active name */
|
||||
strncpy(ed->act_sounddir, seq->strip->dir, FILE_MAXDIR-1);
|
||||
|
||||
return seq;
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int sfile_to_hdsnd_sequence_load(SpaceFile *sfile, int cfra,
|
||||
int machine, int index)
|
||||
{
|
||||
/* XXX sfile recoded... */
|
||||
Sequence *seq;
|
||||
struct hdaudio *hdaudio;
|
||||
Strip *strip;
|
||||
StripElem *se;
|
||||
int totframe;
|
||||
char name[160];
|
||||
char str[FILE_MAXDIR+FILE_MAXFILE];
|
||||
|
||||
totframe= 0;
|
||||
|
||||
strncpy(str, sfile->dir, FILE_MAXDIR-1);
|
||||
if(index<0)
|
||||
strncat(str, sfile->file, FILE_MAXDIR-1);
|
||||
else
|
||||
strncat(str, sfile->filelist[index].relname, FILE_MAXDIR-1);
|
||||
|
||||
/* is it a sound file? */
|
||||
hdaudio = sound_open_hdaudio(str);
|
||||
if(hdaudio==0) {
|
||||
error("The selected file is not a sound file or "
|
||||
"FFMPEG-support not compiled in!");
|
||||
return(cfra);
|
||||
}
|
||||
|
||||
totframe= sound_hdaudio_get_duration(hdaudio, FPS);
|
||||
|
||||
/* make seq */
|
||||
seq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
seq->len= totframe;
|
||||
seq->type= SEQ_HD_SOUND;
|
||||
seq->hdaudio= hdaudio;
|
||||
|
||||
calc_sequence(seq);
|
||||
|
||||
if(sfile->flag & FILE_STRINGCODE) {
|
||||
strcpy(name, sfile->dir);
|
||||
BLI_makestringcode(G.sce, name);
|
||||
} else {
|
||||
strcpy(name, sfile->dir);
|
||||
}
|
||||
|
||||
/* strip and stripdata */
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len= totframe;
|
||||
strip->us= 1;
|
||||
strncpy(strip->dir, name, FILE_MAXDIR-1);
|
||||
strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
|
||||
|
||||
/* name movie in first strip */
|
||||
if(index<0)
|
||||
strncpy(se->name, sfile->file, FILE_MAXFILE-1);
|
||||
else
|
||||
strncpy(se->name, sfile->filelist[index].relname, FILE_MAXFILE-1);
|
||||
|
||||
/* last active name */
|
||||
strncpy(ed->act_sounddir, seq->strip->dir, FILE_MAXDIR-1);
|
||||
return(cfra+totframe);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void sfile_to_hdsnd_sequence(SpaceFile *sfile, int cfra, int machine)
|
||||
{
|
||||
#if 0
|
||||
/* XXX sfile recoded... */
|
||||
int totsel, a;
|
||||
|
||||
totsel= 0;
|
||||
for(a= 0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if((sfile->filelist[a].type & S_IFDIR)==0) {
|
||||
totsel++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if((totsel==0) && (sfile->file[0])) {
|
||||
cfra= sfile_to_hdsnd_sequence_load(sfile, cfra, machine, -1);
|
||||
return;
|
||||
}
|
||||
|
||||
if(totsel==0) return;
|
||||
|
||||
/* ok, check all the select file, and load it. */
|
||||
for(a= 0; a<sfile->totfile; a++) {
|
||||
if(sfile->filelist[a].flags & ACTIVE) {
|
||||
if((sfile->filelist[a].type & S_IFDIR)==0) {
|
||||
/* load and update current frame. */
|
||||
cfra= sfile_to_hdsnd_sequence_load(sfile, cfra, machine, a);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void add_image_strips(Scene *scene, char *name)
|
||||
{
|
||||
#if 0
|
||||
/* XXX sfile recoded... */
|
||||
|
||||
SpaceFile *sfile;
|
||||
struct direntry *files;
|
||||
float x, y;
|
||||
int a, totfile, cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
/* restore windowmatrices */
|
||||
// XXX drawseqspace(curarea, curarea->spacedata.first);
|
||||
|
||||
/* search sfile */
|
||||
// sfile= scrarea_find_space_of_type(curarea, SPACE_FILE);
|
||||
if(sfile==0) return;
|
||||
|
||||
/* where will it be */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
/* also read contents of directories */
|
||||
files= sfile->filelist;
|
||||
totfile= sfile->totfile;
|
||||
sfile->filelist= 0;
|
||||
sfile->totfile= 0;
|
||||
|
||||
for(a=0; a<totfile; a++) {
|
||||
if(files[a].flags & ACTIVE) {
|
||||
if( (files[a].type & S_IFDIR) ) {
|
||||
strncat(sfile->dir, files[a].relname, FILE_MAXFILE-1);
|
||||
strcat(sfile->dir,"/");
|
||||
read_dir(sfile);
|
||||
|
||||
/* select all */
|
||||
swapselect_file(sfile);
|
||||
|
||||
if ( sfile_to_sequence(scene, sfile, cfra, machine, 0) ) machine++;
|
||||
|
||||
parent(sfile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sfile->filelist= files;
|
||||
sfile->totfile= totfile;
|
||||
|
||||
/* read directory itself */
|
||||
sfile_to_sequence(scene, sfile, cfra, machine, 1);
|
||||
|
||||
waitcursor(0);
|
||||
|
||||
BIF_undo_push("Add Image Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void add_movie_strip(Scene *scene, View2D *v2d, char *name)
|
||||
{
|
||||
|
||||
/* XXX sfile recoded... */
|
||||
SpaceFile *sfile;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
/* restore windowmatrices */
|
||||
// drawseqspace(curarea, curarea->spacedata.first);
|
||||
|
||||
/* search sfile */
|
||||
// sfile= scrarea_find_space_of_type(curarea, SPACE_FILE);
|
||||
if(sfile==0) return;
|
||||
|
||||
/* where will it be */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
/* read directory itself */
|
||||
sfile_to_mv_sequence(sfile, cfra, machine);
|
||||
|
||||
waitcursor(0);
|
||||
|
||||
BIF_undo_push("Add Movie Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
|
||||
}
|
||||
|
||||
static void add_movie_and_hdaudio_strip(Scene *scene, View2D *v2d, char *name)
|
||||
{
|
||||
SpaceFile *sfile;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
/* restore windowmatrices */
|
||||
// areawinset(curarea->win);
|
||||
// drawseqspace(curarea, curarea->spacedata.first);
|
||||
|
||||
/* search sfile */
|
||||
// sfile= scrarea_find_space_of_type(curarea, SPACE_FILE);
|
||||
if(sfile==0) return;
|
||||
|
||||
/* where will it be */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
/* read directory itself */
|
||||
sfile_to_hdsnd_sequence(sfile, cfra, machine);
|
||||
sfile_to_mv_sequence(sfile, cfra, machine);
|
||||
|
||||
waitcursor(0);
|
||||
|
||||
BIF_undo_push("Add Movie and HD-Audio Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
|
||||
}
|
||||
|
||||
static void add_sound_strip_ram(Scene *scene, View2D *v2d, char *name)
|
||||
{
|
||||
SpaceFile *sfile;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
// sfile= scrarea_find_space_of_type(curarea, SPACE_FILE);
|
||||
if (sfile==0) return;
|
||||
|
||||
/* where will it be */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
sfile_to_ramsnd_sequence(scene, sfile, cfra, machine);
|
||||
|
||||
waitcursor(0);
|
||||
|
||||
BIF_undo_push("Add Sound (RAM) Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
}
|
||||
|
||||
static void add_sound_strip_hd(Scene *scene, View2D *v2d, char *name)
|
||||
{
|
||||
SpaceFile *sfile;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
// sfile= scrarea_find_space_of_type(curarea, SPACE_FILE);
|
||||
if (sfile==0) return;
|
||||
|
||||
/* where will it be */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
sfile_to_hdsnd_sequence(sfile, cfra, machine);
|
||||
|
||||
waitcursor(0);
|
||||
|
||||
BIF_undo_push("Add Sound (HD) Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
}
|
||||
|
||||
static void add_scene_strip(Scene *scene, View2D *v2d, short event)
|
||||
{
|
||||
Sequence *seq;
|
||||
Strip *strip;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
|
||||
if(event> -1) {
|
||||
int nr= 1;
|
||||
Scene * sce= G.main->scene.first;
|
||||
while(sce) {
|
||||
if( event==nr) break;
|
||||
nr++;
|
||||
sce= sce->id.next;
|
||||
}
|
||||
if(sce) {
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
/* where ? */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
seq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
seq->type= SEQ_SCENE;
|
||||
seq->scene= sce;
|
||||
seq->sfra= sce->r.sfra;
|
||||
seq->len= sce->r.efra - sce->r.sfra + 1;
|
||||
|
||||
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strncpy(seq->name + 2, sce->id.name + 2,
|
||||
sizeof(seq->name) - 2);
|
||||
strip->len= seq->len;
|
||||
strip->us= 1;
|
||||
|
||||
BIF_undo_push("Add Scene Strip, Sequencer");
|
||||
transform_seq_nomarker('g', 0);
|
||||
}
|
||||
}
|
||||
if(event==2) return SEQ_CROSS;
|
||||
if(event==3) return SEQ_GAMCROSS;
|
||||
if(event==4) return SEQ_ADD;
|
||||
if(event==5) return SEQ_SUB;
|
||||
if(event==6) return SEQ_MUL;
|
||||
if(event==7) return SEQ_ALPHAOVER;
|
||||
if(event==8) return SEQ_ALPHAUNDER;
|
||||
if(event==9) return SEQ_OVERDROP;
|
||||
if(event==10) return SEQ_PLUGIN;
|
||||
if(event==13) return SEQ_WIPE;
|
||||
if(event==14) return SEQ_GLOW;
|
||||
if(event==15) return SEQ_TRANSFORM;
|
||||
if(event==16) return SEQ_COLOR;
|
||||
if(event==17) return SEQ_SPEED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
@@ -1341,7 +780,7 @@ static void reload_image_strip(Scene *scene, char *name)
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
seq= sfile_to_sequence(scene, sfile, seqact->start, seqact->machine, 1);
|
||||
// seq= sfile_to_sequence(scene, sfile, seqact->start, seqact->machine, 1); // XXX ADD BACK
|
||||
if(seq && seq!=seqact) {
|
||||
seq_free_strip(seqact->strip);
|
||||
|
||||
@@ -1360,345 +799,6 @@ static void reload_image_strip(Scene *scene, char *name)
|
||||
|
||||
}
|
||||
|
||||
static int event_to_efftype(int event)
|
||||
{
|
||||
if(event==2) return SEQ_CROSS;
|
||||
if(event==3) return SEQ_GAMCROSS;
|
||||
if(event==4) return SEQ_ADD;
|
||||
if(event==5) return SEQ_SUB;
|
||||
if(event==6) return SEQ_MUL;
|
||||
if(event==7) return SEQ_ALPHAOVER;
|
||||
if(event==8) return SEQ_ALPHAUNDER;
|
||||
if(event==9) return SEQ_OVERDROP;
|
||||
if(event==10) return SEQ_PLUGIN;
|
||||
if(event==13) return SEQ_WIPE;
|
||||
if(event==14) return SEQ_GLOW;
|
||||
if(event==15) return SEQ_TRANSFORM;
|
||||
if(event==16) return SEQ_COLOR;
|
||||
if(event==17) return SEQ_SPEED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequence **selseq1, Sequence **selseq2, Sequence **selseq3)
|
||||
{
|
||||
Editing *ed = scene->ed;
|
||||
Sequence *seq1= 0, *seq2= 0, *seq3= 0, *seq;
|
||||
|
||||
if (!activeseq)
|
||||
seq2= get_last_seq(scene);
|
||||
|
||||
for(seq=ed->seqbasep->first; seq; seq=seq->next) {
|
||||
if(seq->flag & SELECT) {
|
||||
if (seq->type == SEQ_RAM_SOUND
|
||||
|| seq->type == SEQ_HD_SOUND) {
|
||||
error("Can't apply effects to "
|
||||
"audio sequence strips");
|
||||
return 0;
|
||||
}
|
||||
if((seq != activeseq) && (seq != seq2)) {
|
||||
if(seq2==0) seq2= seq;
|
||||
else if(seq1==0) seq1= seq;
|
||||
else if(seq3==0) seq3= seq;
|
||||
else {
|
||||
error("Can't apply effect to more than 3 sequence strips");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* make sequence selection a little bit more intuitive
|
||||
for 3 strips: the last-strip should be sequence3 */
|
||||
if (seq3 != 0 && seq2 != 0) {
|
||||
Sequence *tmp = seq2;
|
||||
seq2 = seq3;
|
||||
seq3 = tmp;
|
||||
}
|
||||
|
||||
|
||||
switch(get_sequence_effect_num_inputs(type)) {
|
||||
case 0:
|
||||
*selseq1 = *selseq2 = *selseq3 = 0;
|
||||
return 1;
|
||||
case 1:
|
||||
if(seq2==0) {
|
||||
error("Need at least one selected sequence strip");
|
||||
return 0;
|
||||
}
|
||||
if(seq1==0) seq1= seq2;
|
||||
if(seq3==0) seq3= seq2;
|
||||
case 2:
|
||||
if(seq1==0 || seq2==0) {
|
||||
error("Need 2 selected sequence strips");
|
||||
return 0;
|
||||
}
|
||||
if(seq3==0) seq3= seq2;
|
||||
}
|
||||
|
||||
if (seq1==NULL && seq2==NULL && seq3==NULL) return 0;
|
||||
|
||||
*selseq1= seq1;
|
||||
*selseq2= seq2;
|
||||
*selseq3= seq3;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int add_seq_effect(Scene *scene, View2D *v2d, int type, char *str)
|
||||
{
|
||||
Editing *ed;
|
||||
Sequence *newseq, *seq1, *seq2, *seq3;
|
||||
Strip *strip;
|
||||
float x, y;
|
||||
int cfra, machine;
|
||||
short mval[2];
|
||||
struct SeqEffectHandle sh;
|
||||
|
||||
if(scene->ed==NULL) return 0;
|
||||
ed= scene->ed;
|
||||
|
||||
if(!seq_effect_find_selected(scene, NULL, event_to_efftype(type), &seq1, &seq2, &seq3))
|
||||
return 0;
|
||||
|
||||
deselect_all_seq(scene);
|
||||
|
||||
/* where will it be (cfra is not realy needed) */
|
||||
// getmouseco_areawin(mval);
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
|
||||
cfra= (int)(x+0.5);
|
||||
machine= (int)(y+0.5);
|
||||
|
||||
/* allocate and initialize */
|
||||
newseq= alloc_sequence(((Editing *)scene->ed)->seqbasep, cfra, machine);
|
||||
newseq->type= event_to_efftype(type);
|
||||
|
||||
sh = get_sequence_effect(newseq);
|
||||
|
||||
newseq->seq1= seq1;
|
||||
newseq->seq2= seq2;
|
||||
newseq->seq3= seq3;
|
||||
|
||||
sh.init(newseq);
|
||||
|
||||
if (!seq1) {
|
||||
newseq->len= 1;
|
||||
newseq->startstill= 25;
|
||||
newseq->endstill= 24;
|
||||
}
|
||||
|
||||
calc_sequence(newseq);
|
||||
|
||||
newseq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
|
||||
strip->len= newseq->len;
|
||||
strip->us= 1;
|
||||
if(newseq->len>0)
|
||||
strip->stripdata= MEM_callocN(newseq->len*sizeof(StripElem), "stripelem");
|
||||
|
||||
/* initialize plugin */
|
||||
if(newseq->type == SEQ_PLUGIN) {
|
||||
sh.init_plugin(newseq, str);
|
||||
|
||||
if(newseq->plugin==0) {
|
||||
BLI_remlink(ed->seqbasep, newseq);
|
||||
seq_free_sequence(newseq);
|
||||
set_last_seq(scene, NULL);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* set find a free spot to but the strip */
|
||||
if (newseq->seq1) {
|
||||
newseq->machine= MAX3(newseq->seq1->machine,
|
||||
newseq->seq2->machine,
|
||||
newseq->seq3->machine);
|
||||
}
|
||||
if(test_overlap_seq(scene, newseq)) shuffle_seq(scene, newseq);
|
||||
|
||||
update_changed_seq_and_deps(scene, newseq, 1, 1);
|
||||
|
||||
/* push undo and go into grab mode */
|
||||
if(newseq->type == SEQ_PLUGIN) {
|
||||
BIF_undo_push("Add Plugin Strip, Sequencer");
|
||||
} else {
|
||||
BIF_undo_push("Add Effect Strip, Sequencer");
|
||||
}
|
||||
|
||||
transform_seq_nomarker('g', 0);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void load_plugin_seq(Scene *scene, View2D *v2d, char *str) /* called from fileselect */
|
||||
{
|
||||
add_seq_effect(scene, v2d, 10, str);
|
||||
}
|
||||
|
||||
void add_sequence(Scene *scene, View2D *v2d, int type)
|
||||
{
|
||||
Editing *ed= scene->ed;
|
||||
short event;
|
||||
char *str;
|
||||
|
||||
if (type >= 0){
|
||||
/* bypass pupmenu for calls from menus (aphex) */
|
||||
switch(type){
|
||||
case SEQ_SCENE:
|
||||
event = 101;
|
||||
break;
|
||||
case SEQ_IMAGE:
|
||||
event = 1;
|
||||
break;
|
||||
case SEQ_MOVIE:
|
||||
event = 102;
|
||||
break;
|
||||
case SEQ_RAM_SOUND:
|
||||
event = 103;
|
||||
break;
|
||||
case SEQ_HD_SOUND:
|
||||
event = 104;
|
||||
break;
|
||||
case SEQ_MOVIE_AND_HD_SOUND:
|
||||
event = 105;
|
||||
break;
|
||||
case SEQ_PLUGIN:
|
||||
event = 10;
|
||||
break;
|
||||
case SEQ_CROSS:
|
||||
event = 2;
|
||||
break;
|
||||
case SEQ_ADD:
|
||||
event = 4;
|
||||
break;
|
||||
case SEQ_SUB:
|
||||
event = 5;
|
||||
break;
|
||||
case SEQ_ALPHAOVER:
|
||||
event = 7;
|
||||
break;
|
||||
case SEQ_ALPHAUNDER:
|
||||
event = 8;
|
||||
break;
|
||||
case SEQ_GAMCROSS:
|
||||
event = 3;
|
||||
break;
|
||||
case SEQ_MUL:
|
||||
event = 6;
|
||||
break;
|
||||
case SEQ_OVERDROP:
|
||||
event = 9;
|
||||
break;
|
||||
case SEQ_WIPE:
|
||||
event = 13;
|
||||
break;
|
||||
case SEQ_GLOW:
|
||||
event = 14;
|
||||
break;
|
||||
case SEQ_TRANSFORM:
|
||||
event = 15;
|
||||
break;
|
||||
case SEQ_COLOR:
|
||||
event = 16;
|
||||
break;
|
||||
case SEQ_SPEED:
|
||||
event = 17;
|
||||
break;
|
||||
default:
|
||||
event = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
event= pupmenu("Add Sequence Strip%t"
|
||||
"|Image Sequence%x1"
|
||||
"|Movie%x102"
|
||||
#ifdef WITH_FFMPEG
|
||||
"|Movie + Audio (HD)%x105"
|
||||
"|Audio (RAM)%x103"
|
||||
"|Audio (HD)%x104"
|
||||
#else
|
||||
"|Audio (Wav)%x103"
|
||||
#endif
|
||||
"|Scene%x101"
|
||||
"|Plugin%x10"
|
||||
"|Cross%x2"
|
||||
"|Gamma Cross%x3"
|
||||
"|Add%x4"
|
||||
"|Sub%x5"
|
||||
"|Mul%x6"
|
||||
"|Alpha Over%x7"
|
||||
"|Alpha Under%x8"
|
||||
"|Alpha Over Drop%x9"
|
||||
"|Wipe%x13"
|
||||
"|Glow%x14"
|
||||
"|Transforms%x15"
|
||||
"|Color Generator%x16"
|
||||
"|Speed Control%x17");
|
||||
}
|
||||
|
||||
if(event<1) return;
|
||||
|
||||
if(scene->ed==NULL) {
|
||||
ed= scene->ed= MEM_callocN( sizeof(Editing), "addseq");
|
||||
ed->seqbasep= &ed->seqbase;
|
||||
}
|
||||
|
||||
switch(event) {
|
||||
case 1:
|
||||
/* Image Dosnt work at the moment - TODO */
|
||||
//if(G.qual & LR_CTRLKEY)
|
||||
// activate_imageselect(FILE_SPECIAL, "Select Images", ed->act_imagedir, add_image_strips);
|
||||
//else
|
||||
activate_fileselect(FILE_SPECIAL, "Select Images", ed->act_imagedir, add_image_strips);
|
||||
break;
|
||||
case 105:
|
||||
activate_fileselect(FILE_SPECIAL, "Select Movie+Audio", ed->act_imagedir, add_movie_and_hdaudio_strip);
|
||||
break;
|
||||
case 102:
|
||||
|
||||
activate_fileselect(FILE_SPECIAL, "Select Movie", ed->act_imagedir, add_movie_strip);
|
||||
break;
|
||||
case 101:
|
||||
/* new menu: */
|
||||
IDnames_to_pupstring(&str, NULL, NULL, &G.main->scene, (ID *)scene, NULL);
|
||||
|
||||
add_scene_strip(scene, v2d, pupmenu_col(str, 20));
|
||||
|
||||
MEM_freeN(str);
|
||||
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
case 13:
|
||||
case 14:
|
||||
case 15:
|
||||
case 16:
|
||||
case 17:
|
||||
if(get_last_seq(scene)==0 &&
|
||||
get_sequence_effect_num_inputs( event_to_efftype(event))> 0)
|
||||
error("Need at least one active sequence strip");
|
||||
else if(event==10)
|
||||
activate_fileselect(FILE_SPECIAL, "Select Plugin", U.plugseqdir, load_plugin_seq);
|
||||
else
|
||||
add_seq_effect(scene, v2d, event, NULL);
|
||||
|
||||
break;
|
||||
case 103:
|
||||
if (ed->act_sounddir[0]=='\0') strncpy(ed->act_sounddir, U.sounddir, FILE_MAXDIR-1);
|
||||
activate_fileselect(FILE_SPECIAL, "Select Audio (RAM)", ed->act_sounddir, add_sound_strip_ram);
|
||||
break;
|
||||
case 104:
|
||||
if (ed->act_sounddir[0]=='\0') strncpy(ed->act_sounddir, U.sounddir, FILE_MAXDIR-1);
|
||||
activate_fileselect(FILE_SPECIAL, "Select Audio (HD)", ed->act_sounddir, add_sound_strip_hd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void change_sequence(Scene *scene)
|
||||
{
|
||||
@@ -1798,6 +898,71 @@ void change_sequence(Scene *scene)
|
||||
|
||||
}
|
||||
|
||||
int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequence **selseq1, Sequence **selseq2, Sequence **selseq3)
|
||||
{
|
||||
Editing *ed = scene->ed;
|
||||
Sequence *seq1= 0, *seq2= 0, *seq3= 0, *seq;
|
||||
|
||||
if (!activeseq)
|
||||
seq2= get_last_seq(scene);
|
||||
|
||||
for(seq=ed->seqbasep->first; seq; seq=seq->next) {
|
||||
if(seq->flag & SELECT) {
|
||||
if (seq->type == SEQ_RAM_SOUND
|
||||
|| seq->type == SEQ_HD_SOUND) {
|
||||
error("Can't apply effects to "
|
||||
"audio sequence strips");
|
||||
return 0;
|
||||
}
|
||||
if((seq != activeseq) && (seq != seq2)) {
|
||||
if(seq2==0) seq2= seq;
|
||||
else if(seq1==0) seq1= seq;
|
||||
else if(seq3==0) seq3= seq;
|
||||
else {
|
||||
error("Can't apply effect to more than 3 sequence strips");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* make sequence selection a little bit more intuitive
|
||||
for 3 strips: the last-strip should be sequence3 */
|
||||
if (seq3 != 0 && seq2 != 0) {
|
||||
Sequence *tmp = seq2;
|
||||
seq2 = seq3;
|
||||
seq3 = tmp;
|
||||
}
|
||||
|
||||
|
||||
switch(get_sequence_effect_num_inputs(type)) {
|
||||
case 0:
|
||||
*selseq1 = *selseq2 = *selseq3 = 0;
|
||||
return 1;
|
||||
case 1:
|
||||
if(seq2==0) {
|
||||
error("Need at least one selected sequence strip");
|
||||
return 0;
|
||||
}
|
||||
if(seq1==0) seq1= seq2;
|
||||
if(seq3==0) seq3= seq2;
|
||||
case 2:
|
||||
if(seq1==0 || seq2==0) {
|
||||
error("Need 2 selected sequence strips");
|
||||
return 0;
|
||||
}
|
||||
if(seq3==0) seq3= seq2;
|
||||
}
|
||||
|
||||
if (seq1==NULL && seq2==NULL && seq3==NULL) return 0;
|
||||
|
||||
*selseq1= seq1;
|
||||
*selseq2= seq2;
|
||||
*selseq3= seq3;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void reload_sequence(Scene *scene)
|
||||
{
|
||||
Editing *ed= scene->ed;
|
||||
|
||||
@@ -44,6 +44,7 @@ void sequencer_header_buttons(const struct bContext *C, struct ARegion *ar);
|
||||
void drawseqspace(const struct bContext *C, struct ARegion *ar);
|
||||
|
||||
/* sequencer_edit.c */
|
||||
struct View2D;
|
||||
int check_single_seq(struct Sequence *seq);
|
||||
int seq_tx_get_final_left(struct Sequence *seq, int metaclip);
|
||||
int seq_tx_get_final_right(struct Sequence *seq, int metaclip);
|
||||
@@ -54,9 +55,13 @@ struct Sequence *find_nearest_seq(struct Scene *scene, struct View2D *v2d, int *
|
||||
struct Sequence *find_neighboring_sequence(struct Scene *scene, struct Sequence *test, int lr, int sel);
|
||||
void deselect_all_seq(struct Scene *scene);
|
||||
void recurs_sel_seq(struct Sequence *seqm);
|
||||
|
||||
int event_to_efftype(int event);
|
||||
void set_last_seq(struct Scene *scene, struct Sequence *seq);
|
||||
int seq_effect_find_selected(struct Scene *scene, struct Sequence *activeseq, int type, struct Sequence **selseq1, struct Sequence **selseq2, struct Sequence **selseq3);
|
||||
struct Sequence *alloc_sequence(struct ListBase *lb, int cfra, int machine);
|
||||
|
||||
int test_overlap_seq(struct Scene *scene, struct Sequence *test);
|
||||
void shuffle_seq(struct Scene *scene, struct Sequence *test);
|
||||
|
||||
/* operators */
|
||||
struct wmOperatorType;
|
||||
@@ -64,6 +69,8 @@ struct wmWindowManager;
|
||||
void SEQUENCER_OT_cut(struct wmOperatorType *ot);
|
||||
void SEQUENCER_OT_mute(struct wmOperatorType *ot);
|
||||
void SEQUENCER_OT_unmute(struct wmOperatorType *ot);
|
||||
|
||||
/* sequencer_select.c */
|
||||
void SEQUENCER_OT_deselect_all(struct wmOperatorType *ot);
|
||||
void SEQUENCER_OT_select(struct wmOperatorType *ot);
|
||||
void SEQUENCER_OT_select_more(struct wmOperatorType *ot);
|
||||
@@ -73,6 +80,13 @@ void SEQUENCER_OT_select_pick_linked(struct wmOperatorType *ot);
|
||||
void SEQUENCER_OT_borderselect(struct wmOperatorType *ot);
|
||||
void SEQUENCER_OT_select_invert(struct wmOperatorType *ot);
|
||||
|
||||
|
||||
/* sequencer_select.c */
|
||||
void SEQUENCER_OT_add_color_strip(struct wmOperatorType *ot);
|
||||
void SEQUENCER_OT_add_scene_strip(struct wmOperatorType *ot);
|
||||
|
||||
|
||||
|
||||
/* RNA enums, just to be more readable */
|
||||
enum {
|
||||
SEQ_LEFT,
|
||||
|
||||
@@ -60,9 +60,12 @@
|
||||
|
||||
void sequencer_operatortypes(void)
|
||||
{
|
||||
/* sequencer_edit.c */
|
||||
WM_operatortype_append(SEQUENCER_OT_cut);
|
||||
WM_operatortype_append(SEQUENCER_OT_mute);
|
||||
WM_operatortype_append(SEQUENCER_OT_unmute);
|
||||
|
||||
/* sequencer_select.c */
|
||||
WM_operatortype_append(SEQUENCER_OT_deselect_all);
|
||||
WM_operatortype_append(SEQUENCER_OT_select_invert);
|
||||
WM_operatortype_append(SEQUENCER_OT_select);
|
||||
@@ -71,12 +74,22 @@ void sequencer_operatortypes(void)
|
||||
WM_operatortype_append(SEQUENCER_OT_select_pick_linked);
|
||||
WM_operatortype_append(SEQUENCER_OT_select_linked);
|
||||
WM_operatortype_append(SEQUENCER_OT_borderselect);
|
||||
|
||||
/* sequencer_add.c */
|
||||
WM_operatortype_append(SEQUENCER_OT_add_color_strip);
|
||||
WM_operatortype_append(SEQUENCER_OT_add_scene_strip);
|
||||
}
|
||||
|
||||
void sequencer_keymap(wmWindowManager *wm)
|
||||
{
|
||||
ListBase *keymap= WM_keymap_listbase(wm, "Sequencer", SPACE_SEQ, 0);
|
||||
|
||||
|
||||
WM_keymap_add_item(keymap, "SEQUENCER_OT_add_color_strip", RKEY, KM_PRESS, 0, 0); // XXX JUST FOR TESTING
|
||||
WM_keymap_add_item(keymap, "SEQUENCER_OT_add_scene_strip", TKEY, KM_PRESS, 0, 0); // XXX JUST FOR TESTING
|
||||
|
||||
|
||||
|
||||
WM_keymap_add_item(keymap, "SEQUENCER_OT_deselect_all", AKEY, KM_PRESS, 0, 0);
|
||||
WM_keymap_add_item(keymap, "SEQUENCER_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0);
|
||||
|
||||
|
||||
@@ -294,7 +294,7 @@ static int sequencer_select_invert_exec(bContext *C, wmOperator *op)
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
Editing *ed= scene->ed;
|
||||
Sequence *seq;
|
||||
int desel = 0;
|
||||
|
||||
|
||||
for(seq= ed->seqbasep->first; seq; seq=seq->next) {
|
||||
if (seq->flag & SELECT) {
|
||||
|
||||
Reference in New Issue
Block a user