Removed FexTracker for good.
Originally committed to SVN as r1214.
This commit is contained in:
parent
94385aca8f
commit
1a5906f97c
37 changed files with 3 additions and 2583 deletions
|
@ -1,87 +0,0 @@
|
||||||
// This file is part of FexGenericFilter and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
#include "StdAfx.h"
|
|
||||||
#include "FexGenericFilter_Include.h"
|
|
||||||
|
|
||||||
FexFilter::FexFilter()
|
|
||||||
{
|
|
||||||
Width = 3;
|
|
||||||
}
|
|
||||||
FexFilter::~FexFilter()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
double FexFilter::Filter( double t )
|
|
||||||
{
|
|
||||||
return t/Width;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
f(x) = e^(-x^2 / (2 s^2) )
|
|
||||||
f(x) = e^(-x^2 / t)
|
|
||||||
|
|
||||||
width:
|
|
||||||
SOLVE(0.1 = f(x), x, Real)
|
|
||||||
x = - sqrt(t LN(10) ? x = sqrt(t LN(10)
|
|
||||||
x = - 1.517427129·sqrt t ? x = 1.517427129·sqrt t
|
|
||||||
x = - sqrt(2*s*s* LN(10)) ? x = sqrt(2*s*s* LN(10))
|
|
||||||
x = - 2.145966026·s ? x = 2.145966026·s
|
|
||||||
|
|
||||||
sum:
|
|
||||||
|
|
||||||
Integral from -sqrt(t LN(10) to sqrt(t LN(10) of f(x) dx
|
|
||||||
1.715955662·sqrt(t)
|
|
||||||
2.426727768·s
|
|
||||||
*/
|
|
||||||
|
|
||||||
FexFilter_Gauss::FexFilter_Gauss( double sigma )
|
|
||||||
{
|
|
||||||
Sigma = sigma;
|
|
||||||
TwoSigmaSq = 2*sigma*sigma;
|
|
||||||
Width = 2.145966026 * sigma;
|
|
||||||
Normalize = 1.0 / (2.426727768 * sigma);
|
|
||||||
Normalize *= 1.0 + 0.1 / Width; //its the 0.1 we left out
|
|
||||||
}
|
|
||||||
FexFilter_Gauss::~FexFilter_Gauss()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
double FexFilter_Gauss::Filter( double t )
|
|
||||||
{
|
|
||||||
return exp( -t*t / TwoSigmaSq ) * Normalize;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
f(x) = -x * e^(-x^2 / (2 s^2) )
|
|
||||||
f(x) = -x * e^(-x^2 / t)
|
|
||||||
|
|
||||||
width:
|
|
||||||
use the width of gauss since i'm clueless here
|
|
||||||
|
|
||||||
sum:
|
|
||||||
|
|
||||||
Integral from -sqrt(t LN(10) to sqrt(t LN(10) of -x*f(x) dx
|
|
||||||
0.7062351183·t^1.5
|
|
||||||
*/
|
|
||||||
|
|
||||||
FexFilter_GaussDerivation::FexFilter_GaussDerivation( double sigma )
|
|
||||||
{
|
|
||||||
Sigma = sigma;
|
|
||||||
TwoSigmaSq = 2*sigma*sigma;
|
|
||||||
Width = 2.145966026 * sigma;
|
|
||||||
Normalize = 1.0 / (0.7062351183 * pow( TwoSigmaSq, 1.5 ));
|
|
||||||
}
|
|
||||||
|
|
||||||
FexFilter_GaussDerivation::~FexFilter_GaussDerivation()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
double FexFilter_GaussDerivation::Filter( double t )
|
|
||||||
{
|
|
||||||
return -t * exp( -t*t / TwoSigmaSq ) * Normalize;
|
|
||||||
}
|
|
|
@ -1,93 +0,0 @@
|
||||||
// This file is part of FexGenericFilter and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
#include "StdAfx.h"
|
|
||||||
#include "FexGenericFilter_Include.h"
|
|
||||||
|
|
||||||
|
|
||||||
void BaseFloatImage_Filter( float* in, int inSx, int inSy, FexFilter* filter, float* out, int outSx, int outSy )
|
|
||||||
{
|
|
||||||
#define FilterWidth (filter->Width)
|
|
||||||
#define FilterWeight(t) (filter->Filter(t))
|
|
||||||
|
|
||||||
float* tmp = new float[outSx*inSy];
|
|
||||||
#include "FexGenericFilter_BaseFloatImageApply.h"
|
|
||||||
delete []tmp;
|
|
||||||
|
|
||||||
#undef FilterWidth
|
|
||||||
#undef FilterWeight
|
|
||||||
}
|
|
||||||
|
|
||||||
void BaseFloatImage_FilterSeperate( float* in, int inSx, int inSy, FexFilter* filterX, FexFilter* filterY, float* out, int outSx, int outSy )
|
|
||||||
{
|
|
||||||
float* tmp = new float[outSx*inSy];
|
|
||||||
|
|
||||||
#define FilterWidth (filterX->Width)
|
|
||||||
#define FilterWeight(t) (filterX->Filter(t))
|
|
||||||
#define FILTER_NO_Y
|
|
||||||
|
|
||||||
#include "FexGenericFilter_BaseFloatImageApply.h"
|
|
||||||
|
|
||||||
#undef FilterWidth
|
|
||||||
#undef FilterWeight
|
|
||||||
#undef FILTER_NO_Y
|
|
||||||
|
|
||||||
#define FilterWidth (filterY->Width)
|
|
||||||
#define FilterWeight(t) (filterY->Filter(t))
|
|
||||||
#define FILTER_NO_X
|
|
||||||
|
|
||||||
#include "FexGenericFilter_BaseFloatImageApply.h"
|
|
||||||
|
|
||||||
#undef FilterWidth
|
|
||||||
#undef FilterWeight
|
|
||||||
#undef FILTER_NO_X
|
|
||||||
|
|
||||||
delete []tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void BaseFloatImage_GaussEdgeDetect( float* Img, int sizx, int sizy, float sigma, float* GradX, float* GradY )
|
|
||||||
{
|
|
||||||
FexFilter_Gauss gauss (sigma);
|
|
||||||
FexFilter_GaussDerivation gaussDeriv (sigma);
|
|
||||||
|
|
||||||
BaseFloatImage_FilterSeperate( Img, sizx, sizy, &gaussDeriv, &gauss, GradX, sizx, sizy );
|
|
||||||
BaseFloatImage_FilterSeperate( Img, sizx, sizy, &gauss, &gaussDeriv, GradY, sizx, sizy );
|
|
||||||
}
|
|
||||||
|
|
||||||
void BaseFloatImage_GaussSmooth( float* Img, int sizx, int sizy, float sigma, float* Out )
|
|
||||||
{
|
|
||||||
FexFilter_Gauss gauss (sigma);
|
|
||||||
BaseFloatImage_Filter( Img, sizx,sizy, &gauss, Out, sizx, sizy );
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
inline double sinc( double x )
|
|
||||||
{
|
|
||||||
x *= 3.1415;
|
|
||||||
if( x != 0 )
|
|
||||||
return( sin(x) / x );
|
|
||||||
return( 1.0 );
|
|
||||||
}
|
|
||||||
inline double RescaleFilter( double t )
|
|
||||||
{
|
|
||||||
if( t < 0 )
|
|
||||||
t = -t;
|
|
||||||
if( t < 3.0 )
|
|
||||||
return( sinc(t) * sinc(t/3.0) );
|
|
||||||
return( 0.0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void BaseFloatImage_LanczosRescale( float* in, int inSx, int inSy, float* out, int outSx, int outSy )
|
|
||||||
{
|
|
||||||
#define FilterWidth (3)
|
|
||||||
#define FilterWeight(t) (RescaleFilter(t))
|
|
||||||
|
|
||||||
float* tmp = new float[outSx*inSy];
|
|
||||||
#include "FexGenericFilter_BaseFloatImageApply.h"
|
|
||||||
delete []tmp;
|
|
||||||
|
|
||||||
#undef FilterWidth
|
|
||||||
#undef FilterWeight
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
// This file is part of FexGenericFilter and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
{
|
|
||||||
#define PixelType float
|
|
||||||
#define PixelMin 0
|
|
||||||
#define PixelMax 255
|
|
||||||
#define ImagePlanes 1
|
|
||||||
|
|
||||||
//do filtering + scaling in x-dir
|
|
||||||
#define ImageInSX (inSx)
|
|
||||||
#define ImageInSY (inSy)
|
|
||||||
#define ImageIn(x,y,p) (in[ (y*inSx+x) ])
|
|
||||||
#define ImageOutSX (outSx)
|
|
||||||
#define ImageOut(x,y,p) (tmp[ (y*outSx+x) ])
|
|
||||||
|
|
||||||
#ifndef FILTER_NO_X
|
|
||||||
#include "FexGenericFilter_FilteringCore.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef ImageInSX
|
|
||||||
#undef ImageInSY
|
|
||||||
#undef ImageIn
|
|
||||||
#undef ImageOutSX
|
|
||||||
#undef ImageOut
|
|
||||||
|
|
||||||
//do filtering + scaling in y-dir by using transposed image
|
|
||||||
|
|
||||||
#define ImageInSX (inSy)
|
|
||||||
#define ImageInSY (outSx)
|
|
||||||
#define ImageIn(y,x,p) (tmp[ (y*outSx+x) ])
|
|
||||||
#define ImageOutSX (outSy)
|
|
||||||
#define ImageOut(y,x,p) (out[ (y*outSx+x) ])
|
|
||||||
|
|
||||||
#ifndef FILTER_NO_Y
|
|
||||||
#include "FexGenericFilter_FilteringCore.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef ImageInSX
|
|
||||||
#undef ImageInSY
|
|
||||||
#undef ImageIn
|
|
||||||
#undef ImageOutSX
|
|
||||||
#undef ImageOut
|
|
||||||
|
|
||||||
#undef PixelType
|
|
||||||
#undef PixelMin
|
|
||||||
#undef PixelMax
|
|
||||||
#undef ImagePlanes
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
// This file is part of FexGenericFilter and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
{
|
|
||||||
double width = FilterWidth;
|
|
||||||
#ifdef CONTRIB_XSCALE
|
|
||||||
width /= XScale;
|
|
||||||
double fscale = 1.0 / XScale;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for(int i=0;i<ImageOutSX;++i)
|
|
||||||
{
|
|
||||||
double center = (double) i / XScale;
|
|
||||||
FexFilterContribution* cc = &Contrib[i];
|
|
||||||
int left = (int) ceil(center - width);
|
|
||||||
int right = (int) (floor(center + width) + 0.1);
|
|
||||||
|
|
||||||
cc->xMin = left;
|
|
||||||
cc->xMax = right;
|
|
||||||
if( cc->xMin < 0 ) cc->xMin = 0;
|
|
||||||
if( cc->xMax > ImageInSX-1 ) cc->xMax = ImageInSX - 1;
|
|
||||||
|
|
||||||
int len = cc->xMax-cc->xMin+1;
|
|
||||||
cc->Weight = new double[ len ];
|
|
||||||
memset( cc->Weight, 0x00, sizeof(double)*len );
|
|
||||||
|
|
||||||
for(int j=left;j<=right;++j) {
|
|
||||||
double weight = center - (double) j;
|
|
||||||
#ifdef CONTRIB_XSCALE
|
|
||||||
weight = FilterWeight(weight / fscale) / fscale;
|
|
||||||
#else
|
|
||||||
weight = FilterWeight(weight);
|
|
||||||
#endif
|
|
||||||
int n;
|
|
||||||
if(j < 0) n=0;
|
|
||||||
else if(j >= ImageInSX) n = ImageInSX - 1;
|
|
||||||
else n = j;
|
|
||||||
cc->Weight[n-cc->xMin] += weight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,57 +0,0 @@
|
||||||
// This file is part of FexGenericFilter and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
{
|
|
||||||
FexFilterContribution* Contrib = new FexFilterContribution[ ImageOutSX ];
|
|
||||||
double XScale = (double)ImageOutSX / (double) ImageInSX;
|
|
||||||
|
|
||||||
//calculate contributions
|
|
||||||
|
|
||||||
if( XScale < 1.0 )
|
|
||||||
{
|
|
||||||
#define CONTRIB_XSCALE
|
|
||||||
#include "FexGenericFilter_Contribution.h"
|
|
||||||
#undef CONTRIB_XSCALE
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#include "FexGenericFilter_Contribution.h"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#include "FexGenericFilter_StaticFor.h"
|
|
||||||
//apply filter
|
|
||||||
|
|
||||||
for( int y=0;y<ImageInSY;++y)
|
|
||||||
{
|
|
||||||
for( int x=0;x<ImageOutSX;++x )
|
|
||||||
{
|
|
||||||
FexFilterContribution* cc = &Contrib[x];
|
|
||||||
|
|
||||||
double Sum[ImagePlanes];
|
|
||||||
#define DOFOR(i) Sum[i] = 0.0;
|
|
||||||
STATIC_FOR
|
|
||||||
#undef DOFOR
|
|
||||||
|
|
||||||
for( int lx=cc->xMin;lx<=cc->xMax;++lx )
|
|
||||||
{
|
|
||||||
#define DOFOR(i) Sum[i] += ((double)ImageIn(lx,y,i))*cc->Weight[lx-cc->xMin];
|
|
||||||
STATIC_FOR
|
|
||||||
#undef DOFOR
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DOFOR(i) {if(Sum[i]<PixelMin)Sum[i]=PixelMin;if(Sum[i]>PixelMax)Sum[i]=PixelMax;}
|
|
||||||
STATIC_FOR
|
|
||||||
#undef DOFOR
|
|
||||||
|
|
||||||
#define DOFOR(i) ImageOut(x,y,i) = (PixelType) Sum[i];
|
|
||||||
STATIC_FOR
|
|
||||||
#undef DOFOR
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for( int x=0;x<ImageOutSX;++x )
|
|
||||||
delete []Contrib[x].Weight;
|
|
||||||
delete []Contrib;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
// This file is part of FexGenericFilter and (C) 2006 by Hajo Krabbenh<6E>t (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
class FexFilter {
|
|
||||||
public:
|
|
||||||
FexFilter();
|
|
||||||
virtual ~FexFilter();
|
|
||||||
|
|
||||||
virtual double Filter( double t );
|
|
||||||
|
|
||||||
double Width;
|
|
||||||
};
|
|
||||||
|
|
||||||
class FexFilter_Gauss : public FexFilter {
|
|
||||||
public:
|
|
||||||
FexFilter_Gauss( double sigma );
|
|
||||||
virtual ~FexFilter_Gauss();
|
|
||||||
|
|
||||||
double Filter( double t );
|
|
||||||
|
|
||||||
double Sigma;
|
|
||||||
double TwoSigmaSq;
|
|
||||||
double Normalize;
|
|
||||||
};
|
|
||||||
|
|
||||||
class FexFilter_GaussDerivation : public FexFilter {
|
|
||||||
public:
|
|
||||||
FexFilter_GaussDerivation( double sigma );
|
|
||||||
virtual ~FexFilter_GaussDerivation();
|
|
||||||
|
|
||||||
double Filter( double t );
|
|
||||||
|
|
||||||
double Sigma;
|
|
||||||
double TwoSigmaSq;
|
|
||||||
double Normalize;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FexFilterContribution {
|
|
||||||
int xMin, xMax;
|
|
||||||
double* Weight;
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
// This file is part of FexGenericFilter and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
#if ImagePlanes==1
|
|
||||||
#define STATIC_FOR {DOFOR(0)}
|
|
||||||
#elif ImagePlanes==3
|
|
||||||
#define STATIC_FOR {DOFOR(0) DOFOR(1) DOFOR(2)}
|
|
||||||
#elif ImagePlanes==4
|
|
||||||
#define STATIC_FOR {DOFOR(0) DOFOR(1) DOFOR(2) DOFOR(3)}
|
|
||||||
#else
|
|
||||||
#define STATIC_FOR {for( int dofori=0;dofori<ImagePlanes;++doforti ){DOFOR(i)}}
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,115 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
// FexImgPyramid.cpp: implementation of the FexImgPyramid class.
|
|
||||||
//
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "StdAfx.h"
|
|
||||||
#include "FexImgPyramid.h"
|
|
||||||
#include "FexGenericFilter_Include.h"
|
|
||||||
|
|
||||||
void BaseFloatImage_GaussEdgeDetect( float* Img, int sizx, int sizy, float sigma, float* GradX, float* GradY );
|
|
||||||
void BaseFloatImage_GaussSmooth( float* Img, int sizx, int sizy, float sigma, float* Out );
|
|
||||||
void BaseFloatImage_LanczosRescale( float* in, int inSx, int inSy, float* out, int outSx, int outSy );
|
|
||||||
|
|
||||||
#ifndef MIN
|
|
||||||
#define MIN(a,b) ((a)<(b))?(a):(b)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
// Construction/Destruction
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
//turn off image debugging
|
|
||||||
#ifndef imdebug
|
|
||||||
#define imdebug(a,b,c,d) //
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
FexImgPyramidLevel::FexImgPyramidLevel( int isx, int isy )
|
|
||||||
{
|
|
||||||
sx = isx;
|
|
||||||
sy = isy;
|
|
||||||
Img = new float[ sx*sy ];
|
|
||||||
GradX = new float[ sx*sy ];
|
|
||||||
GradY = new float[ sx*sy ];
|
|
||||||
}
|
|
||||||
|
|
||||||
FexImgPyramidLevel::~FexImgPyramidLevel()
|
|
||||||
{
|
|
||||||
delete [] Img;
|
|
||||||
delete [] GradX;
|
|
||||||
delete [] GradY;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FexImgPyramidLevel::Fill( float* iImg, float DetectSmoothSigma )
|
|
||||||
{
|
|
||||||
imdebug("lum b=32f w=%d h=%d %p /255", sx, sy, iImg);
|
|
||||||
BaseFloatImage_GaussSmooth( iImg, sx, sy, DetectSmoothSigma, Img );
|
|
||||||
imdebug("lum b=32f w=%d h=%d %p /255", sx, sy, Img);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FexImgPyramidLevel::Scale( FexImgPyramidLevel* old )
|
|
||||||
{
|
|
||||||
imdebug("lum b=32f w=%d h=%d %p /255", old->sx, old->sy, old->Img);
|
|
||||||
BaseFloatImage_LanczosRescale( old->Img, old->sx, old->sy, Img, sx, sy );
|
|
||||||
imdebug("lum b=32f w=%d h=%d %p /255", sx, sy, Img);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FexImgPyramidLevel::Calc( float EdgeDetectSigma )
|
|
||||||
{
|
|
||||||
imdebug("lum b=32f w=%d h=%d %p /255", sx, sy, Img);
|
|
||||||
BaseFloatImage_GaussEdgeDetect( Img, sx, sy, EdgeDetectSigma, GradX, GradY );
|
|
||||||
imdebug("lum b=32f w=%d h=%d %p /2", sx, sy, GradX);
|
|
||||||
imdebug("lum b=32f w=%d h=%d %p /2", sx, sy, GradY);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FexImgPyramid::FexImgPyramid( float* Img, int SizX, int SizY, float EdgeDetectSigma, float DetectSmoothSigma, int iSubsampling, int Levels )
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
Subsampling = iSubsampling;
|
|
||||||
|
|
||||||
if( Levels == -1 ) Levels = 999;
|
|
||||||
int mLvl = 0;
|
|
||||||
int tsm = MIN(SizX,SizY);
|
|
||||||
while( tsm>1 && tsm%2==0 )
|
|
||||||
{
|
|
||||||
tsm/=Subsampling;
|
|
||||||
++mLvl;
|
|
||||||
}
|
|
||||||
if( Levels > mLvl ) Levels = mLvl;
|
|
||||||
if( Levels < 1 ) Levels = 1;
|
|
||||||
|
|
||||||
nLevels = Levels;
|
|
||||||
lLevels = new FexImgPyramidLevel*[ nLevels ];
|
|
||||||
|
|
||||||
lLevels[0] = new FexImgPyramidLevel( SizX, SizY );
|
|
||||||
lLevels[0]->Fill( Img, DetectSmoothSigma );
|
|
||||||
for( i=1;i<nLevels;i++ )
|
|
||||||
{
|
|
||||||
SizX /= Subsampling;
|
|
||||||
SizY /= Subsampling;
|
|
||||||
lLevels[i] = new FexImgPyramidLevel( SizX, SizY );
|
|
||||||
lLevels[i]->Scale( lLevels[i-1] );
|
|
||||||
}
|
|
||||||
|
|
||||||
float cmul = 1.f;
|
|
||||||
for( i=0;i<nLevels;i++ )
|
|
||||||
{
|
|
||||||
lLevels[i]->CoordMul = cmul;
|
|
||||||
lLevels[i]->Calc( EdgeDetectSigma );
|
|
||||||
cmul /= Subsampling;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FexImgPyramid::~FexImgPyramid()
|
|
||||||
{
|
|
||||||
for( int i=0;i<nLevels;i++ )
|
|
||||||
delete lLevels[i];
|
|
||||||
delete [] lLevels;
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
// FexImgPyramid.h: interface for the FexImgPyramid class.
|
|
||||||
//
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#if !defined(AFX_FEXIMGPYRAMID_H__B289955E_6660_483D_AF51_CE78F2D03944__INCLUDED_)
|
|
||||||
#define AFX_FEXIMGPYRAMID_H__B289955E_6660_483D_AF51_CE78F2D03944__INCLUDED_
|
|
||||||
|
|
||||||
#if _MSC_VER > 1000
|
|
||||||
#pragma once
|
|
||||||
#endif // _MSC_VER > 1000
|
|
||||||
|
|
||||||
class FexImgPyramidLevel
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FexImgPyramidLevel( int sx, int sy );
|
|
||||||
~FexImgPyramidLevel();
|
|
||||||
|
|
||||||
int sx, sy; // dimensions of this level
|
|
||||||
float CoordMul;
|
|
||||||
|
|
||||||
float* Img; // actual image data
|
|
||||||
float* GradX; // X gradients
|
|
||||||
float* GradY; // Y gradients
|
|
||||||
|
|
||||||
void Fill( float* Img, float DetectSmoothSigma );
|
|
||||||
void Scale( FexImgPyramidLevel* old );
|
|
||||||
void Calc( float EdgeDetectSigma );
|
|
||||||
};
|
|
||||||
|
|
||||||
class FexImgPyramid
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FexImgPyramid( float* Img, int SizX, int SizY, float EdgeDetectSigma, float DetectSmoothSigma, int Subsampling, int Levels );
|
|
||||||
~FexImgPyramid();
|
|
||||||
|
|
||||||
int Subsampling;
|
|
||||||
|
|
||||||
FexImgPyramidLevel** lLevels;
|
|
||||||
int nLevels;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // !defined(AFX_FEXIMGPYRAMID_H__B289955E_6660_483D_AF51_CE78F2D03944__INCLUDED_)
|
|
|
@ -1,97 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
// FexMovement.cpp: implementation of the FexMovement class.
|
|
||||||
//
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "StdAfx.h"
|
|
||||||
#include "stdio.h"
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <conio.h>
|
|
||||||
#endif
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <wchar.h>
|
|
||||||
//#include <mmsystem.h>
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
// Construction/Destruction
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
FexMovement::FexMovement()
|
|
||||||
{
|
|
||||||
FileName = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
FexMovement::~FexMovement()
|
|
||||||
{
|
|
||||||
if( FileName ) delete []FileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
FEXTRACKER_API FexMovement* CreateMovement()
|
|
||||||
{
|
|
||||||
return new FexMovement();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef WIN32
|
|
||||||
FILE *_wfopen(const wchar_t *wname, const wchar_t *wmode)
|
|
||||||
{
|
|
||||||
size_t namelen = wcstombs(NULL, wname, 0) + 1;
|
|
||||||
char name[namelen];
|
|
||||||
wcstombs(name, wname, namelen);
|
|
||||||
|
|
||||||
size_t modelen = wcstombs(NULL, wmode, 0) + 1;
|
|
||||||
char mode[modelen];
|
|
||||||
wcstombs(mode, wmode, modelen);
|
|
||||||
|
|
||||||
return fopen(name, mode);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
FEXTRACKER_API void LoadMovement( FexMovement* me, const wchar_t* Filename )
|
|
||||||
{
|
|
||||||
me->Frames.nVal = 0;
|
|
||||||
|
|
||||||
me->FileName = new wchar_t[ wcslen(Filename)+1 ];
|
|
||||||
wcscpy( me->FileName, Filename );
|
|
||||||
|
|
||||||
FILE *fi = _wfopen( Filename, L"rt" );
|
|
||||||
if( !fi ) return;
|
|
||||||
//int CurFeat = -1;
|
|
||||||
char Line[512];
|
|
||||||
while( !feof(fi) )
|
|
||||||
{
|
|
||||||
Line[0]=0;
|
|
||||||
fgets( Line, 510, fi );
|
|
||||||
if( !Line[0] ) break;
|
|
||||||
FexMovementFrame f;
|
|
||||||
int r = sscanf( Line, "(%f %f)(%f %f %f)(%f %f)",
|
|
||||||
&f.Pos.x, &f.Pos.y,
|
|
||||||
&f.Rot.x, &f.Rot.y, &f.Rot.z,
|
|
||||||
&f.Scale.x, &f.Scale.y );
|
|
||||||
if( r != 7 ) continue;
|
|
||||||
me->Frames.Add( f );
|
|
||||||
}
|
|
||||||
fclose( fi );
|
|
||||||
}
|
|
||||||
FEXTRACKER_API void SaveMovement( FexMovement* me, const wchar_t* Filename )
|
|
||||||
{
|
|
||||||
FILE *fi = _wfopen( Filename, L"wt" );
|
|
||||||
if( !fi ) return;
|
|
||||||
for( int i=0;i<me->Frames.size();i++ )
|
|
||||||
{
|
|
||||||
const FexMovementFrame f = me->Frames[i];
|
|
||||||
fprintf( fi, "(%f %f)(%f %f %f)(%f %f)\n",
|
|
||||||
f.Pos.x, f.Pos.y,
|
|
||||||
f.Rot.x, f.Rot.y, f.Rot.z,
|
|
||||||
f.Scale.x, f.Scale.y );
|
|
||||||
}
|
|
||||||
fclose( fi );
|
|
||||||
}
|
|
||||||
|
|
||||||
FEXTRACKER_API void DeleteMovement( FexMovement* delme )
|
|
||||||
{
|
|
||||||
delete delme;
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
// FexMovement.h: interface for the FexMovement class.
|
|
||||||
//
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#if !defined(AFX_FEXMOVEMENT_H__63D8ADD8_4EA1_4C56_8D6F_7B587A1A61A4__INCLUDED_)
|
|
||||||
#define AFX_FEXMOVEMENT_H__63D8ADD8_4EA1_4C56_8D6F_7B587A1A61A4__INCLUDED_
|
|
||||||
|
|
||||||
#if _MSC_VER > 1000
|
|
||||||
#pragma once
|
|
||||||
#endif // _MSC_VER > 1000
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
vec2 Pos;
|
|
||||||
vec3 Rot;
|
|
||||||
vec2 Scale;
|
|
||||||
}FexMovementFrame;
|
|
||||||
|
|
||||||
#include "tenlist.h"
|
|
||||||
|
|
||||||
class FexMovement
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FexMovement();
|
|
||||||
~FexMovement();
|
|
||||||
wchar_t* FileName;
|
|
||||||
|
|
||||||
tenlist<FexMovementFrame> Frames;
|
|
||||||
};
|
|
||||||
|
|
||||||
FEXTRACKER_API FexMovement* CreateMovement();
|
|
||||||
FEXTRACKER_API void LoadMovement( FexMovement* me, const wchar_t* Filename );
|
|
||||||
FEXTRACKER_API void SaveMovement( FexMovement* me, const wchar_t* Filename );
|
|
||||||
FEXTRACKER_API void DeleteMovement( FexMovement* delme );
|
|
||||||
|
|
||||||
#endif // !defined(AFX_FEXMOVEMENT_H__63D8ADD8_4EA1_4C56_8D6F_7B587A1A61A4__INCLUDED_)
|
|
|
@ -1,558 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
// FexTracker.cpp : Defines the entry point for the DLL application.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "StdAfx.h"
|
|
||||||
#include "stdio.h"
|
|
||||||
|
|
||||||
#ifndef MIN
|
|
||||||
#define MIN(a,b) ((a)<(b))?(a):(b)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MAX
|
|
||||||
#define MAX(a,b) ((a)>(b))?(a):(b)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
FexTracker::FexTracker( int sx, int sy, int inFeatures )
|
|
||||||
{
|
|
||||||
printf( "[ using FexTracker (c)2006 Hajo Krabbenhoft ]\n" );
|
|
||||||
|
|
||||||
nFeatures = inFeatures;
|
|
||||||
minFeatures = 0;
|
|
||||||
mFeatures = 8;
|
|
||||||
lFeatures = (FexTrackingFeature*) new FexTrackingFeature[mFeatures];
|
|
||||||
SizX = sx;
|
|
||||||
SizY = sy;
|
|
||||||
CurImg = 0;
|
|
||||||
CurFrame = 0;
|
|
||||||
|
|
||||||
bDebug = 0;
|
|
||||||
|
|
||||||
float subsampling = float(Cfg.SearchRange) / float(MIN(Cfg.WindowX,Cfg.WindowY));
|
|
||||||
|
|
||||||
if (subsampling < 1.0) { /* 1.0 = 0+1 */
|
|
||||||
PyramidMaxLevels = 1;
|
|
||||||
} else if (subsampling <= 3.0) { /* 3.0 = 2+1 */
|
|
||||||
PyramidMaxLevels = 2;
|
|
||||||
PyramidSubsampling = 2;
|
|
||||||
} else if (subsampling <= 5.0) { /* 5.0 = 4+1 */
|
|
||||||
PyramidMaxLevels = 2;
|
|
||||||
PyramidSubsampling = 4;
|
|
||||||
} else if (subsampling <= 9.0) { /* 9.0 = 8+1 */
|
|
||||||
PyramidMaxLevels = 2;
|
|
||||||
PyramidSubsampling = 8;
|
|
||||||
} else {
|
|
||||||
/* The following lines are derived from the formula:
|
|
||||||
search_range =
|
|
||||||
window_halfwidth * \sum_{i=0}^{nPyramidLevels-1} 8^i,
|
|
||||||
which is the same as:
|
|
||||||
search_range =
|
|
||||||
window_halfwidth * (8^nPyramidLevels - 1)/(8 - 1).
|
|
||||||
Then, the value is rounded up to the nearest integer. */
|
|
||||||
float val = (float) (log(7.0*subsampling+1.0)/log(8.0));
|
|
||||||
PyramidMaxLevels = (int) (val + 0.99);
|
|
||||||
PyramidSubsampling = 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FexTracker::~FexTracker()
|
|
||||||
{
|
|
||||||
delete [] lFeatures;
|
|
||||||
if( CurImg ) delete CurImg;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FexTracker::ProcessImage( float *Img, bool bFirst )
|
|
||||||
{
|
|
||||||
// Receive new image to track
|
|
||||||
// This assumes it chronologically directly follows the previously processed image
|
|
||||||
if( bFirst || !CurImg )
|
|
||||||
{
|
|
||||||
// First image in series
|
|
||||||
// Initialise a few things
|
|
||||||
CurFrame = 0;
|
|
||||||
CurImg = new FexImgPyramid( Img, SizX, SizY, Cfg.EdgeDetectSigma, Cfg.DetectSmoothSigma, PyramidSubsampling, PyramidMaxLevels );
|
|
||||||
nActiveFeatures = 0;
|
|
||||||
int tmp = nFeatures;
|
|
||||||
nFeatures = 0;
|
|
||||||
// Find initial features
|
|
||||||
FindFeatures( tmp );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Check if we've lost too many features, and find some more if that's the case
|
|
||||||
CountActiveFeatures();
|
|
||||||
if( nActiveFeatures<minFeatures )
|
|
||||||
FindFeatures( minFeatures );
|
|
||||||
// Build image pyramid
|
|
||||||
NextImg = new FexImgPyramid( Img, SizX, SizY, Cfg.EdgeDetectSigma, Cfg.DetectSmoothSigma, PyramidSubsampling, PyramidMaxLevels );
|
|
||||||
// Now correlate the features to the new image
|
|
||||||
TrackFeatures();
|
|
||||||
delete CurImg;
|
|
||||||
CurImg = NextImg;
|
|
||||||
NextImg = 0;
|
|
||||||
}
|
|
||||||
CurFrame++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FexTracker::ProcessingDone()
|
|
||||||
{
|
|
||||||
if( CurImg ) delete CurImg;
|
|
||||||
CurImg = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FexTracker::CountActiveFeatures()
|
|
||||||
{
|
|
||||||
nActiveFeatures = 0;
|
|
||||||
for( int i=0;i<nFeatures;i++ )
|
|
||||||
{
|
|
||||||
// If the feature has a known position for the active frame, it's active
|
|
||||||
if( lFeatures[i].StartTime + lFeatures[i].Pos.size() >= CurFrame )
|
|
||||||
nActiveFeatures++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FexTrackingFeature* FexTracker::operator [] ( int i )
|
|
||||||
{
|
|
||||||
if( i<0 || i>=nFeatures ) return 0;
|
|
||||||
return & lFeatures[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
int FexTracker::GetEigenvalueForPoint( int px, int py )
|
|
||||||
{
|
|
||||||
// Determine window in the image to process
|
|
||||||
int sx = px - Cfg.WindowX;
|
|
||||||
int ex = px + Cfg.WindowX;
|
|
||||||
int sy = py - Cfg.WindowY;
|
|
||||||
int ey = py + Cfg.WindowY;
|
|
||||||
// Clip against the edges of the image
|
|
||||||
if( sx<0 )sx=0;
|
|
||||||
if( sy<0 )sy=0;
|
|
||||||
if( ex>SizX-1 )ex=SizX-1;
|
|
||||||
if( ey>SizY-1 )ey=SizY-1;
|
|
||||||
|
|
||||||
// Stride for the image
|
|
||||||
int imgSX = CurImg->lLevels[0]->sx;
|
|
||||||
// Pointers to X and Y gradient vectors
|
|
||||||
float* gradx = CurImg->lLevels[0]->GradX;
|
|
||||||
float* grady = CurImg->lLevels[0]->GradY;
|
|
||||||
|
|
||||||
// Accumulated entries into the correlation matrix [gxx gxy; gxy gyy]
|
|
||||||
register float gxx = 0, gyy = 0, gxy = 0;
|
|
||||||
// Loop over points inside the window
|
|
||||||
for( int y=sy;y<ey;y++ )
|
|
||||||
{
|
|
||||||
for( int x=sx;x<ex;x++ )
|
|
||||||
{
|
|
||||||
// Get X and Y gradient values of this point
|
|
||||||
float gx = gradx[ imgSX*y + x ];
|
|
||||||
float gy = grady[ imgSX*y + x ];
|
|
||||||
// Add to the matrix entries
|
|
||||||
gxx += gx*gx;
|
|
||||||
gyy += gy*gy;
|
|
||||||
gxy += gx*gy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate the eigenvalue L for the correlation matrix
|
|
||||||
// 0 = det([gxx-L gxy; gxy gyy-L]) = (gxx-L)(gyy-L) - gxy*gxy = L*L + L*(-gxx-gyy) + gxx*gyy - gxy*gxy
|
|
||||||
// Only the smaller of the two eigenvalues has interest, and a factor 1/4 isn't relevant for comparison,
|
|
||||||
// so this is the smallest solution to the second-order polynomial.
|
|
||||||
float val = gxx + gyy - sqrtf((gxx - gyy)*(gxx - gyy) + 4*gxy*gxy);
|
|
||||||
// Limit the value
|
|
||||||
if( val>(1<<30) ) val=(1<<30);
|
|
||||||
return (int) val;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// An int triple (?!) denoting a coordinate pair and an eigenvalue for that position
|
|
||||||
typedef struct{
|
|
||||||
int val, x, y;
|
|
||||||
}littleFeature;
|
|
||||||
|
|
||||||
|
|
||||||
// Swap two triples of ints (in reality two littleFeature)
|
|
||||||
#define SWAP3(list, i, j) \
|
|
||||||
{register int *pi, *pj, tmp; \
|
|
||||||
pi=list+3*(i); pj=list+3*(j); \
|
|
||||||
\
|
|
||||||
tmp=*pi; \
|
|
||||||
*pi++=*pj; \
|
|
||||||
*pj++=tmp; \
|
|
||||||
\
|
|
||||||
tmp=*pi; \
|
|
||||||
*pi++=*pj; \
|
|
||||||
*pj++=tmp; \
|
|
||||||
\
|
|
||||||
tmp=*pi; \
|
|
||||||
*pi=*pj; \
|
|
||||||
*pj=tmp; \
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sort a list of int-triples (littleFeature structs)
|
|
||||||
void _quicksort(int *pointlist, int n)
|
|
||||||
{
|
|
||||||
unsigned int i, j, ln, rn;
|
|
||||||
|
|
||||||
while (n > 1)
|
|
||||||
{
|
|
||||||
SWAP3(pointlist, 0, n/2);
|
|
||||||
for (i = 0, j = n; ; )
|
|
||||||
{
|
|
||||||
do
|
|
||||||
--j;
|
|
||||||
while (pointlist[3*j] < pointlist[0]);
|
|
||||||
do
|
|
||||||
++i;
|
|
||||||
while (i < j && pointlist[3*i] > pointlist[0]);
|
|
||||||
if (i >= j)
|
|
||||||
break;
|
|
||||||
SWAP3(pointlist, i, j);
|
|
||||||
}
|
|
||||||
SWAP3(pointlist, j, 0);
|
|
||||||
ln = j;
|
|
||||||
rn = n - ++j;
|
|
||||||
if (ln < rn)
|
|
||||||
{
|
|
||||||
_quicksort(pointlist, ln);
|
|
||||||
pointlist += 3*j;
|
|
||||||
n = rn;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_quicksort(pointlist + 3*j, rn);
|
|
||||||
n = ln;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#undef SWAP3
|
|
||||||
|
|
||||||
|
|
||||||
void FexTracker::FindFeatures( int minFeatures )
|
|
||||||
{
|
|
||||||
// Detect new features, so there's at least minFeatures available
|
|
||||||
|
|
||||||
// First calculate eigenvalues for each pixel in the image...
|
|
||||||
int nli=0; // Number of LIttle features
|
|
||||||
littleFeature *list = new littleFeature[SizX*SizY];
|
|
||||||
for( int y=0;y<SizY;y++ )
|
|
||||||
{
|
|
||||||
for( int x=0;x<SizX;x++ )
|
|
||||||
{
|
|
||||||
int v = GetEigenvalueForPoint( x, y );
|
|
||||||
// ... if the eigenvalue for a pixel is larger than zero, include it in the list...
|
|
||||||
if( v>0 )
|
|
||||||
{
|
|
||||||
list[nli].val = v;
|
|
||||||
list[nli].x = x;
|
|
||||||
list[nli].y = y;
|
|
||||||
nli++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ... and sort the list
|
|
||||||
_quicksort( (int*)list, nli );
|
|
||||||
// I'll call these "interest points", since they're just candidates for features...
|
|
||||||
|
|
||||||
int oldN = nFeatures;
|
|
||||||
|
|
||||||
// Look through all newly found interest-points and add the most interesting to our
|
|
||||||
// list of features, until we have at least minFeatures
|
|
||||||
for( int i=0;i<nli && nActiveFeatures<minFeatures;i++ )
|
|
||||||
{
|
|
||||||
// Check if this interest point is too close to an existing feature, to avoid excessive clustering
|
|
||||||
int j;
|
|
||||||
for( j=0;j<nFeatures;j++ )
|
|
||||||
{
|
|
||||||
// Check that we didn't lose this feature
|
|
||||||
if( lFeatures[j].StartTime + lFeatures[j].Pos.size() < CurFrame ) continue;
|
|
||||||
|
|
||||||
// Calculate distance between the interest point of the outer loop and this feature
|
|
||||||
float dx = list[i].x - lFeatures[j].Pos[ CurFrame - lFeatures[j].StartTime ].x;
|
|
||||||
float dy = list[i].y - lFeatures[j].Pos[ CurFrame - lFeatures[j].StartTime ].y;
|
|
||||||
float sqr = dx*dx+dy*dy;
|
|
||||||
// And see if it's close enough
|
|
||||||
if( sqr < Cfg.MinDistanceSquare ) break;
|
|
||||||
}
|
|
||||||
if( j!=nFeatures ) continue; // Found an existing feature too close, so skip this interest point
|
|
||||||
|
|
||||||
// Check if we need to allocate more space for features
|
|
||||||
if( nFeatures >= mFeatures )
|
|
||||||
{
|
|
||||||
// Allocate new, larger feature list and copy old features into new list
|
|
||||||
mFeatures = nFeatures+9;
|
|
||||||
mFeatures -= mFeatures%8;
|
|
||||||
FexTrackingFeature * nlFeatures = (FexTrackingFeature*) new FexTrackingFeature[mFeatures];
|
|
||||||
for( int cpy=0;cpy<nFeatures;cpy++ )
|
|
||||||
{
|
|
||||||
nlFeatures[ cpy ].Eigenvalue = lFeatures[ cpy ].Eigenvalue;
|
|
||||||
nlFeatures[ cpy ].StartTime = lFeatures[ cpy ].StartTime;
|
|
||||||
nlFeatures[ cpy ].Influence = lFeatures[ cpy ].Influence;
|
|
||||||
for( int cpy2=0;cpy2<lFeatures[ cpy ].Pos.size();cpy2++ )
|
|
||||||
nlFeatures[ cpy ].Pos.Add( lFeatures[ cpy ].Pos[cpy2] );
|
|
||||||
}
|
|
||||||
// ... finally replacing the old list
|
|
||||||
delete [] lFeatures;
|
|
||||||
lFeatures = nlFeatures;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add this interest point to the end of the feature list
|
|
||||||
lFeatures[nFeatures].Eigenvalue = list[i].val;
|
|
||||||
vec2 pt;
|
|
||||||
pt.x = (float)list[i].x;
|
|
||||||
pt.y = (float)list[i].y;
|
|
||||||
lFeatures[nFeatures].Pos.Add( pt );
|
|
||||||
lFeatures[nFeatures].StartTime = CurFrame;
|
|
||||||
lFeatures[nFeatures].Influence = 0;
|
|
||||||
nFeatures++;
|
|
||||||
nActiveFeatures++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Subtract 1 from the start time of all newly found features
|
|
||||||
for( int j=oldN;j<nFeatures;j++ )
|
|
||||||
lFeatures[j].StartTime = MAX(0,lFeatures[j].StartTime-1);
|
|
||||||
|
|
||||||
|
|
||||||
delete []list;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FexTracker::TrackFeatures()
|
|
||||||
{
|
|
||||||
for( int i=0;i<nFeatures;i++ )
|
|
||||||
{
|
|
||||||
// Check if this feature was already lost in an earlier frame
|
|
||||||
if( lFeatures[i].StartTime + lFeatures[i].Pos.size() < CurFrame ) continue;
|
|
||||||
|
|
||||||
int FeatureFrame = CurFrame - lFeatures[i].StartTime;
|
|
||||||
|
|
||||||
float orig_px = lFeatures[i].Pos[FeatureFrame-1].x;
|
|
||||||
float orig_py = lFeatures[i].Pos[FeatureFrame-1].y;
|
|
||||||
|
|
||||||
vec2 op; // Original point
|
|
||||||
// Calculate position of original point on top level of the pyramid
|
|
||||||
op.x = orig_px * CurImg->lLevels[ CurImg->nLevels-1 ]->CoordMul / CurImg->Subsampling;
|
|
||||||
op.y = orig_py * CurImg->lLevels[ CurImg->nLevels-1 ]->CoordMul / CurImg->Subsampling;
|
|
||||||
vec2 np; // New point
|
|
||||||
np = op; // Assume no motion initially
|
|
||||||
|
|
||||||
int l;
|
|
||||||
for( l=CurImg->nLevels-1;l>=0;l-- )
|
|
||||||
{
|
|
||||||
// Move coordinates one level down in the pyramid
|
|
||||||
op.x *= CurImg->Subsampling;
|
|
||||||
op.y *= CurImg->Subsampling;
|
|
||||||
np.x *= CurImg->Subsampling;
|
|
||||||
np.y *= CurImg->Subsampling;
|
|
||||||
// And try to track the feature
|
|
||||||
if( !TrackOneFeature( l, op, np ) ) break;
|
|
||||||
}
|
|
||||||
// Did the loop finish? If not, tracking failed and the feature was lost
|
|
||||||
if( l!=-1 ) continue;
|
|
||||||
|
|
||||||
// Tracked outside the frame? Feature lost.
|
|
||||||
if( np.x<0 || np.y<0 || np.x>SizX || np.y>SizY ) continue;
|
|
||||||
|
|
||||||
// Otherwise add the new position to the feature's point list
|
|
||||||
lFeatures[i].Pos.Add( np );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FexTracker::TrackOneFeature( int lvl, vec2 op, vec2& np )
|
|
||||||
{
|
|
||||||
// Motion estimate one feature on one level in the image pyramid
|
|
||||||
// @op (in) is the coordinate for the point on the previous frame
|
|
||||||
// @np (out) is the coordinate for the new location of the point, based on the information in this level of the pyramid
|
|
||||||
|
|
||||||
// Border epsilon, defines what is "too close" to the edge of the image
|
|
||||||
static float bordereps = 1.1f;
|
|
||||||
// Check that the point isn't already "almost outside" the image, and let tracking fail if it is
|
|
||||||
if( op.x - Cfg.WindowX < bordereps || op.x + Cfg.WindowX > CurImg->lLevels[lvl]->sx - bordereps ) return 0;
|
|
||||||
if( op.y - Cfg.WindowY < bordereps || op.y + Cfg.WindowY > CurImg->lLevels[lvl]->sy - bordereps ) return 0;
|
|
||||||
if( np.x - Cfg.WindowX < bordereps || np.x + Cfg.WindowX > CurImg->lLevels[lvl]->sx - bordereps ) return 0;
|
|
||||||
if( np.y - Cfg.WindowY < bordereps || np.y + Cfg.WindowY > CurImg->lLevels[lvl]->sy - bordereps ) return 0;
|
|
||||||
|
|
||||||
// Temporary images for holding data in the window around the feature
|
|
||||||
// Desired width of the window
|
|
||||||
int isx = (Cfg.WindowX*2+1);
|
|
||||||
// Desired number of pixels in the window
|
|
||||||
int imsiz = isx*(Cfg.WindowY*2+1);
|
|
||||||
// Simple difference between image data in window around current frame/position and next frame/position
|
|
||||||
float *diff = new float[imsiz];
|
|
||||||
// Something with gradients around old/new position
|
|
||||||
float *gradx = new float[imsiz];
|
|
||||||
float *grady = new float[imsiz];
|
|
||||||
|
|
||||||
bool bOk = 1;
|
|
||||||
// Iteratively obtain better precision motion estimation (FIXME)
|
|
||||||
for( int iteration=0;iteration<Cfg.MaxIterations;iteration++ )
|
|
||||||
{
|
|
||||||
// Calculate diffs and gradients ((FIXME)
|
|
||||||
GetDiffForPointset( lvl, op, np, diff );
|
|
||||||
GetGradForPointset( lvl, op, np, gradx, grady );
|
|
||||||
/*
|
|
||||||
imdebug("lum b=32f w=%d h=%d %p /255", isx, imsiz/isx, diff);
|
|
||||||
imdebug("lum b=32f w=%d h=%d %p /255", isx, imsiz/isx, gradx);
|
|
||||||
imdebug("lum b=32f w=%d h=%d %p /255", isx, imsiz/isx, grady);
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Calculate gradient correlation matrix and some other matrix related to gradients and differences
|
|
||||||
register float gx, gy, di;
|
|
||||||
|
|
||||||
float gxx = 0, gyy = 0, gxy = 0, ex = 0, ey = 0;
|
|
||||||
for( int i=0;i<imsiz;i++ )
|
|
||||||
{
|
|
||||||
di = diff[i];
|
|
||||||
gx = gradx[i];
|
|
||||||
gy = grady[i];
|
|
||||||
|
|
||||||
gxx += gx*gx;
|
|
||||||
gyy += gy*gy;
|
|
||||||
gxy += gx*gy;
|
|
||||||
ex += di*gx;
|
|
||||||
ey += di*gy;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Too small determinant in the gradient corr. matrix? (what does that mean?)
|
|
||||||
float det = gxx*gyy - gxy*gxy;
|
|
||||||
if( det < Cfg.MinDeterminant )
|
|
||||||
{
|
|
||||||
bOk = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// So apparently those two matrices together tell something about the movement
|
|
||||||
float dx = (gyy*ex - gxy*ey)/det;
|
|
||||||
float dy = (gxx*ey - gxy*ex)/det;
|
|
||||||
np.x += dx;
|
|
||||||
np.y += dy;
|
|
||||||
|
|
||||||
// Check if the feature moved too close to a border, in which case it's lost
|
|
||||||
if( ( np.x - Cfg.WindowX < bordereps || np.x + Cfg.WindowX > CurImg->lLevels[lvl]->sx - bordereps )
|
|
||||||
|| ( np.y - Cfg.WindowY < bordereps || np.y + Cfg.WindowY > CurImg->lLevels[lvl]->sy - bordereps ) )
|
|
||||||
{
|
|
||||||
bOk = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the feature didn't move enough in this iteration, assume its motion is properly estimated
|
|
||||||
if( fabs(dx) < Cfg.MinDisplacement && fabs(dy) < Cfg.MinDisplacement )break;
|
|
||||||
}
|
|
||||||
delete [] gradx;
|
|
||||||
delete [] grady;
|
|
||||||
|
|
||||||
// I think this checks if there's too large a difference between the image at the current and the next frame
|
|
||||||
// around the motion estimated feature
|
|
||||||
if( bOk )
|
|
||||||
{
|
|
||||||
GetDiffForPointset( lvl, op, np, diff );
|
|
||||||
|
|
||||||
float sum = 0;
|
|
||||||
for( int i=0;i<imsiz;i++ )
|
|
||||||
sum += fabsf( diff[i] );
|
|
||||||
|
|
||||||
if( sum / float(imsiz) > Cfg.MaxResidue ) bOk = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete [] diff;
|
|
||||||
return bOk;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float Interpolate( float *img, int ImgSX, float x, float y )
|
|
||||||
{
|
|
||||||
// Bilinear interpolation between (x,y) and ((int)x,(int)y)
|
|
||||||
int xt = (int) x; /* coordinates of top-left corner */
|
|
||||||
int yt = (int) y;
|
|
||||||
float ax = x - xt;
|
|
||||||
float ay = y - yt;
|
|
||||||
float *ptr = img + (ImgSX*yt) + xt;
|
|
||||||
|
|
||||||
return ( (1-ax) * (1-ay) * *ptr +
|
|
||||||
ax * (1-ay) * *(ptr+1) +
|
|
||||||
(1-ax) * ay * *(ptr+(ImgSX)) +
|
|
||||||
ax * ay * *(ptr+(ImgSX)+1) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void FexTracker::GetDiffForPointset( int lvl, vec2 op, vec2 np, float* diff )
|
|
||||||
{
|
|
||||||
// Calculate the difference between the current frame and the next frame
|
|
||||||
// locally around the feature point
|
|
||||||
// (using the currently motion estimated coordinates for the new position)
|
|
||||||
float* img1 = CurImg->lLevels[lvl]->Img;
|
|
||||||
int isx1 = CurImg->lLevels[lvl]->sx;
|
|
||||||
float* img2 = NextImg->lLevels[lvl]->Img;
|
|
||||||
int isx2 = NextImg->lLevels[lvl]->sx;
|
|
||||||
for( int y = -Cfg.WindowY; y <= Cfg.WindowY; y++ )
|
|
||||||
{
|
|
||||||
for( int x = -Cfg.WindowX; x <= Cfg.WindowX; x++ )
|
|
||||||
{
|
|
||||||
*diff++ = Interpolate(img1,isx1,op.x+x,op.y+y) - Interpolate(img2,isx2,np.x+x,np.y+y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void FexTracker::GetGradForPointset( int lvl, vec2 op, vec2 np, float* gradx, float* grady )
|
|
||||||
{
|
|
||||||
// Dark magic
|
|
||||||
int isx = CurImg->lLevels[lvl]->sx;
|
|
||||||
|
|
||||||
float* gx1 = CurImg->lLevels[lvl]->GradX;
|
|
||||||
float* gx2 = NextImg->lLevels[lvl]->GradX;
|
|
||||||
|
|
||||||
float* gy1 = CurImg->lLevels[lvl]->GradY;
|
|
||||||
float* gy2 = NextImg->lLevels[lvl]->GradY;
|
|
||||||
|
|
||||||
for( int y = -Cfg.WindowY; y <= Cfg.WindowY; y++ )
|
|
||||||
{
|
|
||||||
for( int x = -Cfg.WindowX; x <= Cfg.WindowX; x++ )
|
|
||||||
{
|
|
||||||
*gradx++ = Interpolate(gx1,isx,op.x+x,op.y+y) + Interpolate(gx2,isx,np.x+x,np.y+y);
|
|
||||||
*grady++ = Interpolate(gy1,isx,op.x+x,op.y+y) + Interpolate(gy2,isx,np.x+x,np.y+y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
static float _minEigenvalue(float gxx, float gxy, float gyy)
|
|
||||||
{
|
|
||||||
return (float) ((gxx + gyy - sqrt((gxx - gyy)*(gxx - gyy) + 4*gxy*gxy))/2.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
//gen eigenvalue matrix:
|
|
||||||
gxx = 0; gxy = 0; gyy = 0;
|
|
||||||
for (yy = y-window_hh ; yy <= y+window_hh ; yy++)
|
|
||||||
{
|
|
||||||
for (xx = x-window_hw ; xx <= x+window_hw ; xx++)
|
|
||||||
{
|
|
||||||
gx = *(gradx->data + ncols*yy+xx);
|
|
||||||
gy = *(grady->data + ncols*yy+xx);
|
|
||||||
gxx += gx * gx;
|
|
||||||
gxy += gx * gy;
|
|
||||||
gyy += gy * gy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//get eigenvalue number
|
|
||||||
val = _minEigenvalue(gxx, gxy, gyy);
|
|
||||||
|
|
||||||
|
|
||||||
for every frame:
|
|
||||||
for every feature:
|
|
||||||
through all pyramid levels from lowres to highres:
|
|
||||||
|
|
||||||
calculate diff, gradx, grady
|
|
||||||
gen eigenvalue matrix
|
|
||||||
error vector = [gradx, grady]*imdiff
|
|
||||||
|
|
||||||
float det = gxx*gyy - gxy*gxy;
|
|
||||||
if (det < small) return KLT_SMALL_DET;
|
|
||||||
*dx = (gyy*ex - gxy*ey)/det;
|
|
||||||
*dy = (gxx*ey - gxy*ex)/det;
|
|
||||||
|
|
||||||
add [dx,dy] to search position
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
|
@ -1,138 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenh<6E>t (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
|
|
||||||
// The following ifdef block is the standard way of creating macros which make exporting
|
|
||||||
// from a DLL simpler. All files within this DLL are compiled with the FEXTRACKER_EXPORTS
|
|
||||||
// symbol defined on the command line. this symbol should not be defined on any project
|
|
||||||
// that uses this DLL. This way any other project whose source files include this file see
|
|
||||||
// FEXTRACKER_API functions as being imported from a DLL, wheras this DLL sees symbols
|
|
||||||
// defined with this macro as being exported.
|
|
||||||
#ifndef AEGISUB
|
|
||||||
#ifdef FEXTRACKER_EXPORTS
|
|
||||||
#define FEXTRACKER_API __declspec(dllexport)
|
|
||||||
#else
|
|
||||||
#define FEXTRACKER_API __declspec(dllimport)
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define FEXTRACKER_API
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class FEXTRACKER_API FexTrackerConfig
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline FexTrackerConfig() :
|
|
||||||
FeatureNumber(0),
|
|
||||||
WindowX(3), WindowY(3),
|
|
||||||
SearchRange(15),
|
|
||||||
DetectSmoothSigma(0.9f),
|
|
||||||
EdgeDetectSigma(1.f),
|
|
||||||
MaxIterations(10),
|
|
||||||
MinDeterminant(0.01f),
|
|
||||||
MinDisplacement(0.1f),
|
|
||||||
MaxResidue(10.f),
|
|
||||||
IgnoreLightning(0),
|
|
||||||
MinDistanceSquare(100.f)
|
|
||||||
{};
|
|
||||||
|
|
||||||
int FeatureNumber;
|
|
||||||
|
|
||||||
int WindowX, WindowY; //static const int window_size = 7;
|
|
||||||
int SearchRange;
|
|
||||||
|
|
||||||
float DetectSmoothSigma; //static const float pyramid_sigma_fact = 0.9f;
|
|
||||||
float EdgeDetectSigma; //static const float grad_sigma = 1.0f;
|
|
||||||
|
|
||||||
int MaxIterations; //static const int max_iterations = 10;
|
|
||||||
float MinDeterminant; //static const float min_determinant = 0.01f;
|
|
||||||
float MinDisplacement; //static const float min_displacement = 0.1f;
|
|
||||||
float MaxResidue; //static const float max_residue = 10.0f;
|
|
||||||
|
|
||||||
bool IgnoreLightning; //static const KLT_BOOL lighting_insensitive = FALSE;
|
|
||||||
|
|
||||||
float MinDistanceSquare; //static const int mindist = 10;
|
|
||||||
|
|
||||||
//static const int min_eigenvalue = 1;
|
|
||||||
//static const float smooth_sigma_fact = 0.1f;
|
|
||||||
//static const KLT_BOOL sequentialMode = FALSE;
|
|
||||||
///* for affine mapping*/
|
|
||||||
//static const int affineConsistencyCheck = -1;
|
|
||||||
//static const int affine_window_size = 15;
|
|
||||||
//static const int affine_max_iterations = 10;
|
|
||||||
//static const float affine_max_residue = 10.0;
|
|
||||||
//static const float affine_min_displacement = 0.02f;
|
|
||||||
//static const float affine_max_displacement_differ = 1.5f;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
float x, y;
|
|
||||||
}vec2;
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
float x, y, z;
|
|
||||||
}vec3;
|
|
||||||
|
|
||||||
class FexImgPyramid;
|
|
||||||
class FexTrackingFeature;
|
|
||||||
class FexMovement;
|
|
||||||
|
|
||||||
class FEXTRACKER_API FexTracker
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FexTracker( int sx, int sy, int nFeatures );
|
|
||||||
~FexTracker();
|
|
||||||
//config
|
|
||||||
FexTrackerConfig Cfg;
|
|
||||||
//work
|
|
||||||
void ProcessImage( float *Img, bool bFirst=0 ); //we assume grayscale image here
|
|
||||||
void ProcessingDone(); // call after last call to ProcessImage to clear temporary storage
|
|
||||||
|
|
||||||
//point -> movement
|
|
||||||
void InfluenceFeatures( int Frame, float x, float y, float off );
|
|
||||||
FexMovement* GetMovement();
|
|
||||||
|
|
||||||
//feature access
|
|
||||||
FexTrackingFeature* operator [] ( int i );
|
|
||||||
inline int GetCount(){ return nFeatures; };
|
|
||||||
inline int GetFrame(){ return CurFrame; };
|
|
||||||
inline int GetSizeX(){ return SizX; };
|
|
||||||
inline int GetSizeY(){ return SizY; };
|
|
||||||
|
|
||||||
bool bDebug;
|
|
||||||
int minFeatures;
|
|
||||||
private:
|
|
||||||
int SizX, SizY;
|
|
||||||
int PyramidSubsampling;
|
|
||||||
int PyramidMaxLevels;
|
|
||||||
FexImgPyramid* CurImg;
|
|
||||||
FexImgPyramid* NextImg;
|
|
||||||
|
|
||||||
void FindFeatures( int minFeatures );
|
|
||||||
void TrackFeatures();
|
|
||||||
|
|
||||||
bool TrackOneFeature( int lvl, vec2 op, vec2& np );
|
|
||||||
int GetEigenvalueForPoint( int px, int py );
|
|
||||||
void GetDiffForPointset( int lvl, vec2 op, vec2 np, float* diff );
|
|
||||||
void GetGradForPointset( int lvl, vec2 op, vec2 np, float* gradx, float* grady );
|
|
||||||
|
|
||||||
void CountActiveFeatures();
|
|
||||||
|
|
||||||
//result
|
|
||||||
FexTrackingFeature* lFeatures; // list of allocated features
|
|
||||||
int nFeatures; // current number of used feature slots
|
|
||||||
int nActiveFeatures; // number of features with motion data on current image
|
|
||||||
int mFeatures; // number of features allocated space for
|
|
||||||
|
|
||||||
int CurFrame;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FEXTRACKER_API void FexBaseResize( float* out, int newx, int newy, float* in, int sizx, int sizy );
|
|
||||||
FEXTRACKER_API void GaussKernelWidths( float sigma, int *gauss_width, int *gaussderiv_width );
|
|
||||||
FEXTRACKER_API void GaussEdgeDetect( float* Img, int sizx, int sizy, float sigma, float* GradX, float* GradY );
|
|
||||||
FEXTRACKER_API void GaussSmooth( float* Img, int sizx, int sizy, float sigma, float* Out );
|
|
||||||
|
|
||||||
|
|
|
@ -1,160 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
// FexTrackerMovement.cpp
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "StdAfx.h"
|
|
||||||
#include "stdio.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void FexTracker::InfluenceFeatures( int Frame, float x, float y, float off )
|
|
||||||
{
|
|
||||||
for( int i=0;i<nFeatures;i++ )
|
|
||||||
{
|
|
||||||
if( Frame < lFeatures[i].StartTime ) continue;
|
|
||||||
|
|
||||||
int FeatureFrame = Frame - lFeatures[i].StartTime;
|
|
||||||
|
|
||||||
if( lFeatures[i].Pos.size() < FeatureFrame ) continue; //feature was lost
|
|
||||||
|
|
||||||
vec2 p = lFeatures[i].Pos[ FeatureFrame ];
|
|
||||||
|
|
||||||
float dist = sqrtf( (p.x-x)*(p.x-x)+(p.y-y)*(p.y-y) );
|
|
||||||
float infl = 1/(dist+1);
|
|
||||||
if( infl < 0.1 ) continue;
|
|
||||||
lFeatures[i].Influence += infl * off;
|
|
||||||
if( lFeatures[i].Influence<0 ) lFeatures[i].Influence = 0;
|
|
||||||
if( lFeatures[i].Influence>1 ) lFeatures[i].Influence = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define VEC2LEN(a) sqrtf( (a).x*(a).x+(a).y*(a).y )
|
|
||||||
|
|
||||||
FexMovement* FexTracker::GetMovement()
|
|
||||||
{
|
|
||||||
FILE *log = fopen( "movementlog.txt", "wt" );
|
|
||||||
|
|
||||||
int i;
|
|
||||||
for( i=0;i<nFeatures;i++ )
|
|
||||||
{
|
|
||||||
if( lFeatures[i].Influence>0.01 )
|
|
||||||
fprintf( log, "Feature(%.2f): %d - %d\n", lFeatures[i].Influence, lFeatures[i].StartTime, lFeatures[i].StartTime+lFeatures[i].Pos.size() );
|
|
||||||
}
|
|
||||||
|
|
||||||
FexMovement *m = new FexMovement();
|
|
||||||
FexMovementFrame f;
|
|
||||||
|
|
||||||
float FirstInfluenceSum = 0;
|
|
||||||
vec2 FirstPos;
|
|
||||||
FirstPos.x = FirstPos.y = 0;
|
|
||||||
|
|
||||||
for( i=0;i<nFeatures;i++ )
|
|
||||||
{
|
|
||||||
if( 0 < lFeatures[i].StartTime ) continue;
|
|
||||||
if( lFeatures[i].Pos.size() <= 0 ) continue;
|
|
||||||
|
|
||||||
vec2 p = lFeatures[i].Pos[ 0 ];
|
|
||||||
|
|
||||||
FirstPos.x += p.x * lFeatures[i].Influence;
|
|
||||||
FirstPos.y += p.y * lFeatures[i].Influence;
|
|
||||||
FirstInfluenceSum += lFeatures[i].Influence;
|
|
||||||
}
|
|
||||||
FirstPos.x /= FirstInfluenceSum;
|
|
||||||
FirstPos.y /= FirstInfluenceSum;
|
|
||||||
|
|
||||||
float FirstLen = 1;
|
|
||||||
|
|
||||||
|
|
||||||
vec2* MidOffset = (vec2*) new vec2[nFeatures];
|
|
||||||
float* MidOffsetLen = (float*) new float[nFeatures];
|
|
||||||
for( int Frame = 0; Frame < CurFrame; Frame ++ )
|
|
||||||
{
|
|
||||||
//set feature offset
|
|
||||||
for( i=0;i<nFeatures;i++ )
|
|
||||||
{
|
|
||||||
if( Frame == lFeatures[i].StartTime )
|
|
||||||
{
|
|
||||||
MidOffset[i].x = FirstPos.x - lFeatures[i].Pos[0].x;
|
|
||||||
MidOffset[i].y = FirstPos.y - lFeatures[i].Pos[0].y;
|
|
||||||
//realOffLen / MidOffLen = FirstLen
|
|
||||||
// => MidOffLen /= FirstLen;
|
|
||||||
MidOffset[i].x /= FirstLen;
|
|
||||||
MidOffset[i].y /= FirstLen;
|
|
||||||
MidOffsetLen[i] = VEC2LEN( MidOffset[i] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//accumulate position
|
|
||||||
float NextLen = 0;
|
|
||||||
float NextInfluenceSum = 0;
|
|
||||||
vec2 NextPos;
|
|
||||||
NextPos.x = NextPos.y = 0;
|
|
||||||
|
|
||||||
for( i=0;i<nFeatures;i++ )
|
|
||||||
{
|
|
||||||
if( Frame < lFeatures[i].StartTime ) continue;
|
|
||||||
int FeatureFrame = Frame - lFeatures[i].StartTime;
|
|
||||||
if( lFeatures[i].Pos.size() <= FeatureFrame ) continue; //feature was lost
|
|
||||||
|
|
||||||
vec2 p = lFeatures[i].Pos[ FeatureFrame ];
|
|
||||||
|
|
||||||
NextPos.x += (p.x+MidOffset[i].x*FirstLen) * lFeatures[i].Influence;
|
|
||||||
NextPos.y += (p.y+MidOffset[i].y*FirstLen) * lFeatures[i].Influence;
|
|
||||||
NextInfluenceSum += lFeatures[i].Influence;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( NextInfluenceSum > 0.01 )
|
|
||||||
{
|
|
||||||
NextPos.x /= NextInfluenceSum;
|
|
||||||
NextPos.y /= NextInfluenceSum;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
NextPos = FirstPos; //take over last one
|
|
||||||
|
|
||||||
for( i=0;i<nFeatures;i++ )
|
|
||||||
{
|
|
||||||
if( Frame < lFeatures[i].StartTime ) continue;
|
|
||||||
int FeatureFrame = Frame - lFeatures[i].StartTime;
|
|
||||||
if( lFeatures[i].Pos.size() <= FeatureFrame ) continue; //feature was lost
|
|
||||||
|
|
||||||
vec2 p = lFeatures[i].Pos[ FeatureFrame ];
|
|
||||||
|
|
||||||
vec2 realMidOff;
|
|
||||||
realMidOff.x = NextPos.x-p.x;
|
|
||||||
realMidOff.y = NextPos.y-p.y;
|
|
||||||
float realMidOffLen = VEC2LEN( realMidOff );
|
|
||||||
|
|
||||||
NextLen += realMidOffLen/MidOffsetLen[i] *lFeatures[i].Influence;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( NextInfluenceSum > 0.01 )
|
|
||||||
{
|
|
||||||
NextLen /= NextInfluenceSum;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
NextLen = FirstLen; //take over last one
|
|
||||||
|
|
||||||
f.Pos = NextPos;
|
|
||||||
f.Rot.x = 0;
|
|
||||||
f.Rot.y = 0;
|
|
||||||
f.Rot.z = 0;
|
|
||||||
f.Scale.x = NextLen;
|
|
||||||
f.Scale.y = NextLen;
|
|
||||||
m->Frames.Add( f );
|
|
||||||
|
|
||||||
FirstPos = NextPos;
|
|
||||||
FirstLen = NextLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
delete []MidOffset;
|
|
||||||
delete []MidOffsetLen;
|
|
||||||
|
|
||||||
fclose( log );
|
|
||||||
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenh<6E>t (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
// FexTrackingFeature.cpp: implementation of the FexTrackingFeature class.
|
|
||||||
//
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "StdAfx.h"
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
// Construction/Destruction
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
FexTrackingFeature::FexTrackingFeature()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
FexTrackingFeature::~FexTrackingFeature()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
// FexTrackingFeature.h: interface for the FexTrackingFeature class.
|
|
||||||
//
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#if !defined(AFX_FEXTRACKINGFEATURE_H__23B42013_9F11_467C_A0F6_F9E647D45CEB__INCLUDED_)
|
|
||||||
#define AFX_FEXTRACKINGFEATURE_H__23B42013_9F11_467C_A0F6_F9E647D45CEB__INCLUDED_
|
|
||||||
|
|
||||||
#if _MSC_VER > 1000
|
|
||||||
#pragma once
|
|
||||||
#endif // _MSC_VER > 1000
|
|
||||||
|
|
||||||
#include "tenlist.h"
|
|
||||||
class FexTrackingFeature
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FexTrackingFeature();
|
|
||||||
~FexTrackingFeature();
|
|
||||||
|
|
||||||
int Eigenvalue;
|
|
||||||
tenlist<vec2> Pos;
|
|
||||||
|
|
||||||
int StartTime;
|
|
||||||
|
|
||||||
float Influence;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // !defined(AFX_FEXTRACKINGFEATURE_H__23B42013_9F11_467C_A0F6_F9E647D45CEB__INCLUDED_)
|
|
|
@ -1,25 +0,0 @@
|
||||||
SUFFIXES = .c .cpp
|
|
||||||
noinst_LIBRARIES = libfex.a
|
|
||||||
AM_CPPFLAGS = -DAEGISUB
|
|
||||||
|
|
||||||
libfex_a_SOURCES = \
|
|
||||||
FexGenericFilter.cpp \
|
|
||||||
FexGenericFilter_BaseFloatImage.cpp \
|
|
||||||
FexImgPyramid.cpp \
|
|
||||||
FexMovement.cpp \
|
|
||||||
FexTracker.cpp \
|
|
||||||
FexTrackerMovement.cpp \
|
|
||||||
FexTrackingFeature.cpp
|
|
||||||
|
|
||||||
noinst_HEADERS = \
|
|
||||||
FexGenericFilter_BaseFloatImageApply.h \
|
|
||||||
FexGenericFilter_Contribution.h \
|
|
||||||
FexGenericFilter_FilteringCore.h \
|
|
||||||
FexGenericFilter_Include.h \
|
|
||||||
FexGenericFilter_StaticFor.h \
|
|
||||||
FexImgPyramid.h \
|
|
||||||
FexMovement.h \
|
|
||||||
FexTracker.h \
|
|
||||||
FexTrackingFeature.h \
|
|
||||||
StdAfx.h \
|
|
||||||
tenlist.h
|
|
|
@ -1,11 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
// stdafx.cpp : source file that includes just the standard includes
|
|
||||||
// FexTracker.pch will be the pre-compiled header
|
|
||||||
// stdafx.obj will contain the pre-compiled type information
|
|
||||||
|
|
||||||
#include "StdAfx.h"
|
|
||||||
|
|
||||||
// TODO: reference any additional headers you need in STDAFX.H
|
|
||||||
// and not in this file
|
|
|
@ -1,44 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
// stdafx.h : include file for standard system include files,
|
|
||||||
// or project specific include files that are used frequently, but
|
|
||||||
// are changed infrequently
|
|
||||||
//
|
|
||||||
|
|
||||||
#if !defined(AFX_STDAFX_H__7E36ECD6_3192_4C7E_88C9_742CCCFA5057__INCLUDED_)
|
|
||||||
#define AFX_STDAFX_H__7E36ECD6_3192_4C7E_88C9_742CCCFA5057__INCLUDED_
|
|
||||||
|
|
||||||
#if _MSC_VER > 1000
|
|
||||||
#pragma once
|
|
||||||
#endif // _MSC_VER > 1000
|
|
||||||
|
|
||||||
|
|
||||||
// Insert your headers here
|
|
||||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
#endif
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <memory.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#include "FexTracker.h"
|
|
||||||
#include "FexImgPyramid.h"
|
|
||||||
#include "FexTrackingFeature.h"
|
|
||||||
#include "FexMovement.h"
|
|
||||||
|
|
||||||
#ifdef IMAGE_DEBUGGER
|
|
||||||
#include "ext/imdebug.h"
|
|
||||||
#else
|
|
||||||
#define imdebug(a,b,c,d) //
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// TODO: reference additional headers your program requires here
|
|
||||||
|
|
||||||
//{{AFX_INSERT_LOCATION}}
|
|
||||||
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
|
||||||
|
|
||||||
#endif // !defined(AFX_STDAFX_H__7E36ECD6_3192_4C7E_88C9_742CCCFA5057__INCLUDED_)
|
|
|
@ -1,68 +0,0 @@
|
||||||
// This file is part of FexTracker and (C) 2006 by Hajo Krabbenhöft (tentacle)
|
|
||||||
// All rights reserved but the aegisub project is allowed to use it.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
template< class type >
|
|
||||||
class tenlist {
|
|
||||||
public:
|
|
||||||
int nVal;
|
|
||||||
int mVal;
|
|
||||||
type* lVal;
|
|
||||||
|
|
||||||
inline tenlist()
|
|
||||||
{
|
|
||||||
mVal = 0;
|
|
||||||
nVal = 0;
|
|
||||||
lVal = 0;
|
|
||||||
//zero everything since we well over-zero it anyway
|
|
||||||
}
|
|
||||||
inline ~tenlist()
|
|
||||||
{
|
|
||||||
free( lVal );
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int size()
|
|
||||||
{
|
|
||||||
return nVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void Add( type t )
|
|
||||||
{
|
|
||||||
if( nVal+1 >= mVal )
|
|
||||||
{
|
|
||||||
mVal += 8;
|
|
||||||
lVal = (type*)realloc( lVal, sizeof(type)*mVal );
|
|
||||||
memset( lVal+nVal, 0x00, sizeof(type)*(mVal-nVal) ); //lVal+nVal, since it'll be multiplied by sizeof(type) due to lVal being a type*
|
|
||||||
}
|
|
||||||
lVal[nVal++] = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void AddStr( type t )
|
|
||||||
{
|
|
||||||
if( nVal+1 >= mVal )
|
|
||||||
{
|
|
||||||
mVal += 8;
|
|
||||||
lVal = (type*)realloc( lVal, sizeof(type)*mVal );
|
|
||||||
memset( lVal+nVal, 0x00, sizeof(type)*(mVal-nVal) ); //lVal+nVal, since it'll be multiplied by sizeof(type) due to lVal being a type*
|
|
||||||
}
|
|
||||||
strcpy( lVal[nVal++], t );
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void Rem( int n )
|
|
||||||
{
|
|
||||||
if( n>=nVal )
|
|
||||||
{
|
|
||||||
nVal = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for( int i=0;i<nVal;i++ )
|
|
||||||
{
|
|
||||||
lVal[i] = lVal[i+n];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type& operator[]( int i ) const
|
|
||||||
{ return lVal[i]; }
|
|
||||||
};
|
|
|
@ -1,5 +1,5 @@
|
||||||
AUTOMAKE_OPTIONS = foreign
|
AUTOMAKE_OPTIONS = foreign
|
||||||
SUBDIRS = ac auto3 automation FexTrackerSource csri aegisub locale
|
SUBDIRS = ac auto3 automation csri aegisub locale
|
||||||
|
|
||||||
lua51/src/liblua.a:
|
lua51/src/liblua.a:
|
||||||
make -C lua51/src CC=$(CXX) a
|
make -C lua51/src CC=$(CXX) a
|
||||||
|
|
|
@ -14,7 +14,7 @@ REVISION := $(if $(SVNREV),-DBUILD_SVN_REVISION=$(SVNREV)) $(if $(DARCSREV),-DBU
|
||||||
BUILDINFO := -DBUILD_CREDIT="\"$(shell whoami)\"" $(REVISION)
|
BUILDINFO := -DBUILD_CREDIT="\"$(shell whoami)\"" $(REVISION)
|
||||||
|
|
||||||
AM_CPPFLAGS = -DAEGISUB -Iposix -include posix/defines.h $(BUILDINFO)
|
AM_CPPFLAGS = -DAEGISUB -Iposix -include posix/defines.h $(BUILDINFO)
|
||||||
aegisub_LDADD = posix/libposix.a ../FexTrackerSource/libfex.a ../csri/lib/.libs/libcsri.a
|
aegisub_LDADD = posix/libposix.a ../csri/lib/.libs/libcsri.a
|
||||||
aegisub_LDFLAGS =
|
aegisub_LDFLAGS =
|
||||||
|
|
||||||
if USE_LIBASS
|
if USE_LIBASS
|
||||||
|
@ -85,7 +85,6 @@ EXTRA_aegisub_SOURCES = \
|
||||||
avisynth_wrap.cpp \
|
avisynth_wrap.cpp \
|
||||||
dialog_associations.cpp \
|
dialog_associations.cpp \
|
||||||
factory.h \
|
factory.h \
|
||||||
fextracker_main_events.cpp \
|
|
||||||
lavc_file.cpp \
|
lavc_file.cpp \
|
||||||
setup0.h \
|
setup0.h \
|
||||||
setup.cpp \
|
setup.cpp \
|
||||||
|
@ -94,7 +93,6 @@ EXTRA_aegisub_SOURCES = \
|
||||||
stdwx.h \
|
stdwx.h \
|
||||||
subtitle_format_prs.cpp \
|
subtitle_format_prs.cpp \
|
||||||
subtitles_provider_libass.cpp \
|
subtitles_provider_libass.cpp \
|
||||||
video_display_fextracker.cpp \
|
|
||||||
video_provider_avs.cpp \
|
video_provider_avs.cpp \
|
||||||
video_provider_dshow.cpp \
|
video_provider_dshow.cpp \
|
||||||
video_provider_lavc.cpp \
|
video_provider_lavc.cpp \
|
||||||
|
@ -140,7 +138,6 @@ aegisub_SOURCES = \
|
||||||
dialog_detached_video.cpp \
|
dialog_detached_video.cpp \
|
||||||
dialog_dummy_video.cpp \
|
dialog_dummy_video.cpp \
|
||||||
dialog_export.cpp \
|
dialog_export.cpp \
|
||||||
dialog_fextracker.cpp \
|
|
||||||
dialog_fonts_collector.cpp \
|
dialog_fonts_collector.cpp \
|
||||||
dialog_jumpto.cpp \
|
dialog_jumpto.cpp \
|
||||||
dialog_kanji_timer.cpp \
|
dialog_kanji_timer.cpp \
|
||||||
|
@ -208,7 +205,6 @@ aegisub_SOURCES = \
|
||||||
video_box.cpp \
|
video_box.cpp \
|
||||||
video_context.cpp \
|
video_context.cpp \
|
||||||
video_display.cpp \
|
video_display.cpp \
|
||||||
video_display_fextracker.cpp \
|
|
||||||
video_display_visual.cpp \
|
video_display_visual.cpp \
|
||||||
video_frame.cpp \
|
video_frame.cpp \
|
||||||
video_provider.cpp \
|
video_provider.cpp \
|
||||||
|
|
|
@ -38,10 +38,6 @@
|
||||||
// Includes
|
// Includes
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <wx/tokenzr.h>
|
#include <wx/tokenzr.h>
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
#include "../FexTrackerSource/FexTracker.h"
|
|
||||||
#include "../FexTrackerSource/FexMovement.h"
|
|
||||||
#endif
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include "ass_dialogue.h"
|
#include "ass_dialogue.h"
|
||||||
#include "ass_override.h"
|
#include "ass_override.h"
|
||||||
|
@ -52,11 +48,6 @@
|
||||||
////////////////////// AssDialogue //////////////////////
|
////////////////////// AssDialogue //////////////////////
|
||||||
// Constructs AssDialogue
|
// Constructs AssDialogue
|
||||||
AssDialogue::AssDialogue() {
|
AssDialogue::AssDialogue() {
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
Tracker = 0;
|
|
||||||
Movement = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
group = _T("[Events]");
|
group = _T("[Events]");
|
||||||
|
|
||||||
Valid = true;
|
Valid = true;
|
||||||
|
@ -76,11 +67,6 @@ AssDialogue::AssDialogue() {
|
||||||
|
|
||||||
|
|
||||||
AssDialogue::AssDialogue(wxString _data,int version) {
|
AssDialogue::AssDialogue(wxString _data,int version) {
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
Tracker = 0;
|
|
||||||
Movement = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Set group
|
// Set group
|
||||||
group = _T("[Events]");
|
group = _T("[Events]");
|
||||||
|
|
||||||
|
@ -115,18 +101,6 @@ AssDialogue::~AssDialogue () {
|
||||||
// Clear
|
// Clear
|
||||||
void AssDialogue::Clear () {
|
void AssDialogue::Clear () {
|
||||||
ClearBlocks();
|
ClearBlocks();
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
if( Tracker )
|
|
||||||
{
|
|
||||||
delete Tracker;
|
|
||||||
Tracker = 0;
|
|
||||||
}
|
|
||||||
if( Movement )
|
|
||||||
{
|
|
||||||
DeleteMovement( Movement );
|
|
||||||
Movement = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -230,20 +204,9 @@ bool AssDialogue::Parse(wxString rawData, int version) {
|
||||||
Effect.Trim(true);
|
Effect.Trim(true);
|
||||||
Effect.Trim(false);
|
Effect.Trim(false);
|
||||||
|
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
if( Effect.BeforeFirst(':')==_T("FexMovement") )
|
|
||||||
{
|
|
||||||
if( Movement ) DeleteMovement( Movement );
|
|
||||||
Movement = CreateMovement();
|
|
||||||
LoadMovement( Movement, Effect.AfterFirst(':').c_str() );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Get text
|
// Get text
|
||||||
Text = rawData.Mid(pos+tkn.GetPosition());
|
Text = rawData.Mid(pos+tkn.GetPosition());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,10 +43,6 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "ass_entry.h"
|
#include "ass_entry.h"
|
||||||
#include "ass_time.h"
|
#include "ass_time.h"
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
class FexTracker;
|
|
||||||
class FexMovement;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
//////////////
|
//////////////
|
||||||
|
@ -171,10 +167,6 @@ public:
|
||||||
wxString Actor; // Actor name
|
wxString Actor; // Actor name
|
||||||
wxString Effect; // Effect name
|
wxString Effect; // Effect name
|
||||||
wxString Text; // Raw text data
|
wxString Text; // Raw text data
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
FexTracker *Tracker; // Point tracker
|
|
||||||
FexMovement *Movement; // Point tracker generated movement
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ASS_EntryType GetType() { return ENTRY_DIALOGUE; }
|
ASS_EntryType GetType() { return ENTRY_DIALOGUE; }
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,7 @@ Please visit http://aegisub.net to download latest version
|
||||||
- Commiting text now commits times as well. (AMZ)
|
- Commiting text now commits times as well. (AMZ)
|
||||||
- Fixed display of end frames on the subtitles grid, when set to frame mode. (demi)
|
- Fixed display of end frames on the subtitles grid, when set to frame mode. (demi)
|
||||||
- Treat comments inside {}'s as plain text, not as overrides; Also, don't assume override blocks start with a backslash, even if they probably should (Dansolo)
|
- Treat comments inside {}'s as plain text, not as overrides; Also, don't assume override blocks start with a backslash, even if they probably should (Dansolo)
|
||||||
|
- Removed FexTracker due to licensing problems; there are plans to implement a new motion tracker in its place
|
||||||
|
|
||||||
|
|
||||||
= 1.10 beta - 2006.08.07 ===========================
|
= 1.10 beta - 2006.08.07 ===========================
|
||||||
|
|
|
@ -1,113 +0,0 @@
|
||||||
// AEGISUB
|
|
||||||
//
|
|
||||||
// Website: http://aegisub.cellosoft.com
|
|
||||||
// Contact: mailto:zeratul@cellosoft.com
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
///////////
|
|
||||||
// Headers
|
|
||||||
#include <wx/notebook.h>
|
|
||||||
#include <wx/statbox.h>
|
|
||||||
#include <wx/sizer.h>
|
|
||||||
#include "dialog_fextracker.h"
|
|
||||||
#include "../FexTrackerSource/FexTracker.h"
|
|
||||||
|
|
||||||
|
|
||||||
///////////////
|
|
||||||
// Constructor
|
|
||||||
DialogFexTracker::DialogFexTracker(wxWindow *parent, FexTrackerConfig *_cfg)
|
|
||||||
: wxDialog (parent,-1,_("Tracker configuration"),wxDefaultPosition)
|
|
||||||
{
|
|
||||||
cfg = _cfg;
|
|
||||||
cfg->FeatureNumber = 0;
|
|
||||||
|
|
||||||
FeatureNumber = new wxTextCtrl(this,-1,_T("250"));
|
|
||||||
MinDistanceSquare = new wxTextCtrl(this,-1,_T("100"));
|
|
||||||
SearchRange = new wxTextCtrl(this,-1,_T("15"));
|
|
||||||
MaxResidue = new wxTextCtrl(this,-1,_T("10"));
|
|
||||||
MaxIterations = new wxTextCtrl(this,-1,_T("10"));
|
|
||||||
|
|
||||||
EdgeDetectSigma = new wxTextCtrl(this,-1,_T("1.0"));
|
|
||||||
WindowX = new wxTextCtrl(this,-1,_T("3"));
|
|
||||||
WindowY = new wxTextCtrl(this,-1,_T("3"));
|
|
||||||
MinDeterminant = new wxTextCtrl(this,-1,_T("0.01"));
|
|
||||||
MinDisplacement = new wxTextCtrl(this,-1,_T("0.1"));
|
|
||||||
|
|
||||||
wxFlexGridSizer *std_grid = new wxFlexGridSizer(2, 5, 10);
|
|
||||||
std_grid->AddGrowableCol(0, 1);
|
|
||||||
wxFlexGridSizer *adv_grid = new wxFlexGridSizer(2, 5, 10);
|
|
||||||
adv_grid->AddGrowableCol(0, 1);
|
|
||||||
|
|
||||||
std_grid->Add(new wxStaticText(this, -1, _("Number of points to track:")), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
|
|
||||||
std_grid->Add(FeatureNumber, 1, wxALIGN_LEFT);
|
|
||||||
std_grid->Add(new wxStaticText(this, -1, _("Minimal (squared) distance between two points:")), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
|
|
||||||
std_grid->Add(MinDistanceSquare, 1, wxALIGN_LEFT);
|
|
||||||
std_grid->Add(new wxStaticText(this,-1,_("Maximum feature movement:")), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
|
|
||||||
std_grid->Add(SearchRange, 1, wxALIGN_LEFT);
|
|
||||||
std_grid->Add(new wxStaticText(this,-1,_("Maximum feature appearance change:")), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
|
|
||||||
std_grid->Add(MaxResidue, 1, wxALIGN_LEFT);
|
|
||||||
std_grid->Add(new wxStaticText(this,-1,_("How much CPU per feature?")), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
|
|
||||||
std_grid->Add(MaxIterations, 1, wxALIGN_LEFT);
|
|
||||||
|
|
||||||
adv_grid->Add(new wxStaticText(this,-1,_("Edge detect filter size:")), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
|
|
||||||
adv_grid->Add(EdgeDetectSigma, 1, wxALIGN_LEFT);
|
|
||||||
adv_grid->Add(new wxStaticText(this,-1,_("Feature comparison width:")), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
|
|
||||||
adv_grid->Add(WindowX, 1, wxALIGN_LEFT);
|
|
||||||
adv_grid->Add(new wxStaticText(this,-1,_("Feature comparison height:")), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
|
|
||||||
adv_grid->Add(WindowY, 1, wxALIGN_LEFT);
|
|
||||||
adv_grid->Add(new wxStaticText(this,-1,_("Minimal determinant:")), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
|
|
||||||
adv_grid->Add(MinDeterminant, 1, wxALIGN_LEFT);
|
|
||||||
adv_grid->Add(new wxStaticText(this,-1,_("Minimal displacement per iteration:")), 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL);
|
|
||||||
adv_grid->Add(MinDisplacement, 1, wxALIGN_LEFT);
|
|
||||||
|
|
||||||
wxSizer *std_box = new wxStaticBoxSizer(new wxStaticBox(this, -1, _("Basic settings")), wxVERTICAL);
|
|
||||||
std_box->Add(std_grid, 0, wxALL|wxEXPAND, 5);
|
|
||||||
wxSizer *adv_box = new wxStaticBoxSizer(new wxStaticBox(this, -1, _("Additional settings")), wxVERTICAL);
|
|
||||||
adv_box->Add(adv_grid, 0, wxALL|wxEXPAND, 5);
|
|
||||||
|
|
||||||
wxStdDialogButtonSizer *buttons = new wxStdDialogButtonSizer();
|
|
||||||
buttons->AddButton(new wxButton(this,wxID_OK,_("Start")));
|
|
||||||
buttons->AddButton(new wxButton(this, wxID_CANCEL));
|
|
||||||
buttons->Realize();
|
|
||||||
|
|
||||||
wxSizer *MainSizer = new wxBoxSizer(wxVERTICAL);
|
|
||||||
|
|
||||||
MainSizer->Add(std_box, 0, wxALL|wxEXPAND, 5);
|
|
||||||
MainSizer->Add(adv_box, 0, wxALL&~wxTOP|wxEXPAND, 5);
|
|
||||||
MainSizer->Add(buttons, 0, wxALL&~wxTOP|wxEXPAND, 5);
|
|
||||||
|
|
||||||
MainSizer->SetSizeHints( this );
|
|
||||||
SetSizer(MainSizer);
|
|
||||||
SetAutoLayout(true);
|
|
||||||
CenterOnParent();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////
|
|
||||||
// Event table
|
|
||||||
BEGIN_EVENT_TABLE(DialogFexTracker,wxDialog)
|
|
||||||
EVT_BUTTON(wxID_OK,DialogFexTracker::OnStart)
|
|
||||||
END_EVENT_TABLE()
|
|
||||||
|
|
||||||
|
|
||||||
////////////
|
|
||||||
// OnStart
|
|
||||||
void DialogFexTracker::OnStart (wxCommandEvent &event) {
|
|
||||||
cfg->FeatureNumber = 0;
|
|
||||||
|
|
||||||
swscanf( FeatureNumber->GetValue(), _T("%d"), &cfg->FeatureNumber );
|
|
||||||
swscanf( WindowX->GetValue(), _T("%d"), &cfg->WindowX );
|
|
||||||
swscanf( WindowY->GetValue(), _T("%d"), &cfg->WindowY );
|
|
||||||
swscanf( SearchRange->GetValue(), _T("%d"), &cfg->SearchRange );
|
|
||||||
swscanf( MaxIterations->GetValue(), _T("%d"), &cfg->MaxIterations );
|
|
||||||
|
|
||||||
swscanf( EdgeDetectSigma->GetValue(), _T("%f"), &cfg->EdgeDetectSigma );
|
|
||||||
swscanf( MinDeterminant->GetValue(), _T("%f"), &cfg->MinDeterminant );
|
|
||||||
swscanf( MinDisplacement->GetValue(), _T("%f"), &cfg->MinDisplacement );
|
|
||||||
swscanf( MaxResidue->GetValue(), _T("%f"), &cfg->MaxResidue );
|
|
||||||
swscanf( MinDistanceSquare->GetValue(), _T("%f"), &cfg->MinDistanceSquare );
|
|
||||||
|
|
||||||
EndModal(0);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
// AEGISUB
|
|
||||||
//
|
|
||||||
// Website: http://aegisub.cellosoft.com
|
|
||||||
// Contact: mailto:zeratul@cellosoft.com
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DIALOG_FEXTRACKER_H
|
|
||||||
#define DIALOG_FEXTRACKER_H
|
|
||||||
|
|
||||||
|
|
||||||
///////////
|
|
||||||
// Headers
|
|
||||||
#include <wx/wxprec.h>
|
|
||||||
|
|
||||||
|
|
||||||
//////////////
|
|
||||||
// Prototypes
|
|
||||||
class FexTrackerConfig;
|
|
||||||
|
|
||||||
|
|
||||||
/////////
|
|
||||||
// Class
|
|
||||||
class DialogFexTracker : public wxDialog {
|
|
||||||
private:
|
|
||||||
FexTrackerConfig * cfg;
|
|
||||||
|
|
||||||
wxTextCtrl *FeatureNumber;
|
|
||||||
wxTextCtrl *EdgeDetectSigma;
|
|
||||||
wxTextCtrl *WindowX, *WindowY;
|
|
||||||
wxTextCtrl *SearchRange;
|
|
||||||
wxTextCtrl *MaxIterations;
|
|
||||||
wxTextCtrl *MinDeterminant;
|
|
||||||
wxTextCtrl *MinDisplacement;
|
|
||||||
wxTextCtrl *MaxResidue;
|
|
||||||
wxTextCtrl *MinDistanceSquare;
|
|
||||||
|
|
||||||
void OnStart (wxCommandEvent &event);
|
|
||||||
|
|
||||||
public:
|
|
||||||
DialogFexTracker(wxWindow *parent, FexTrackerConfig * cfg);
|
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
///////
|
|
||||||
// IDs
|
|
||||||
enum {
|
|
||||||
BUTTON_START = 1520,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -71,12 +71,6 @@
|
||||||
#include "audio_display.h"
|
#include "audio_display.h"
|
||||||
#include "toggle_bitmap.h"
|
#include "toggle_bitmap.h"
|
||||||
#include "dialog_timing_processor.h"
|
#include "dialog_timing_processor.h"
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
#include "../FexTrackerSource/FexTracker.h"
|
|
||||||
#include "../FexTrackerSource/FexTrackingFeature.h"
|
|
||||||
#include "../FexTrackerSource/FexMovement.h"
|
|
||||||
#include "dialog_fextracker.h"
|
|
||||||
#endif
|
|
||||||
#include "dialog_progress.h"
|
#include "dialog_progress.h"
|
||||||
#include "dialog_options.h"
|
#include "dialog_options.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
|
@ -22,23 +22,6 @@ typedef int64_t __int64;
|
||||||
typedef uint64_t __uint64;
|
typedef uint64_t __uint64;
|
||||||
#define abs64 llabs
|
#define abs64 llabs
|
||||||
|
|
||||||
/*
|
|
||||||
#if defined(HAVE_ASA) && defined(HAVE_ASA_H)
|
|
||||||
#define USE_ASA 1
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_LIBSSA) && defined(HAVE_LIBSSA_LIBSSA_H)
|
|
||||||
#define USE_LIBSSA 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define USE_PRS 0
|
|
||||||
#ifndef USE_FEXTRACKER
|
|
||||||
#define USE_FEXTRACKER 0
|
|
||||||
#endif
|
|
||||||
#ifndef USE_ASA
|
|
||||||
#define USE_ASA 0
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "res.h"
|
#include "res.h"
|
||||||
|
|
||||||
#endif /* _DEFINES_H */
|
#endif /* _DEFINES_H */
|
||||||
|
|
|
@ -44,7 +44,6 @@
|
||||||
#include "video_box.h"
|
#include "video_box.h"
|
||||||
#include "video_display.h"
|
#include "video_display.h"
|
||||||
#include "video_display_visual.h"
|
#include "video_display_visual.h"
|
||||||
#include "video_display_fextracker.h"
|
|
||||||
#include "video_slider.h"
|
#include "video_slider.h"
|
||||||
#include "frame_main.h"
|
#include "frame_main.h"
|
||||||
#include "toggle_bitmap.h"
|
#include "toggle_bitmap.h"
|
||||||
|
@ -81,14 +80,6 @@ VideoBox::VideoBox(wxWindow *parent)
|
||||||
AutoScroll->SetToolTip(_("Toggle autoscroll of video"));
|
AutoScroll->SetToolTip(_("Toggle autoscroll of video"));
|
||||||
AutoScroll->SetValue(Options.AsBool(_T("Sync video with subs")));
|
AutoScroll->SetValue(Options.AsBool(_T("Sync video with subs")));
|
||||||
|
|
||||||
// Fextracker
|
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
wxBitmapButton *VideoTrackerMenuButton = new wxBitmapButton(videoPage,Video_Tracker_Menu,wxBITMAP(button_track_points));
|
|
||||||
VideoTrackerMenuButton->SetToolTip(_("FexTracker"));
|
|
||||||
wxBitmapButton *VideoTrackerMenu2Button = new wxBitmapButton(videoPage,Video_Tracker_Menu2,wxBITMAP(button_track_trail));
|
|
||||||
VideoTrackerMenu2Button->SetToolTip(_("FexMovement"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Seek
|
// Seek
|
||||||
videoSlider = new VideoSlider(videoPage,-1);
|
videoSlider = new VideoSlider(videoPage,-1);
|
||||||
videoSlider->SetToolTip(_("Seek video."));
|
videoSlider->SetToolTip(_("Seek video."));
|
||||||
|
@ -138,11 +129,6 @@ VideoBox::VideoBox(wxWindow *parent)
|
||||||
typeSizer->Add(scale,0,wxEXPAND,0);
|
typeSizer->Add(scale,0,wxEXPAND,0);
|
||||||
typeSizer->Add(clip,0,wxEXPAND | wxBOTTOM,5);
|
typeSizer->Add(clip,0,wxEXPAND | wxBOTTOM,5);
|
||||||
typeSizer->Add(realtime,0,wxEXPAND,0);
|
typeSizer->Add(realtime,0,wxEXPAND,0);
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
typeSizer->Add(new wxStaticLine(videoPage),0,wxEXPAND|wxBOTTOM|wxTOP,5);
|
|
||||||
typeSizer->Add(VideoTrackerMenuButton,0,wxEXPAND,0);
|
|
||||||
typeSizer->Add(VideoTrackerMenu2Button,0,wxEXPAND,0);
|
|
||||||
#endif
|
|
||||||
typeSizer->AddStretchSpacer(1);
|
typeSizer->AddStretchSpacer(1);
|
||||||
|
|
||||||
// Top sizer
|
// Top sizer
|
||||||
|
@ -184,12 +170,6 @@ BEGIN_EVENT_TABLE(VideoBox, wxPanel)
|
||||||
EVT_BUTTON(Video_Mode_Scale, VideoBox::OnModeScale)
|
EVT_BUTTON(Video_Mode_Scale, VideoBox::OnModeScale)
|
||||||
EVT_BUTTON(Video_Mode_Clip, VideoBox::OnModeClip)
|
EVT_BUTTON(Video_Mode_Clip, VideoBox::OnModeClip)
|
||||||
EVT_TOGGLEBUTTON(Video_Mode_Realtime, VideoBox::OnToggleRealtime)
|
EVT_TOGGLEBUTTON(Video_Mode_Realtime, VideoBox::OnToggleRealtime)
|
||||||
|
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
EVT_BUTTON(Video_Tracker_Menu, VideoBox::OnVideoTrackerMenu)
|
|
||||||
EVT_BUTTON(Video_Tracker_Menu2, VideoBox::OnVideoTrackerMenu2)
|
|
||||||
EVT_MENU_RANGE(Video_Tracker_START,Video_Tracker_END, VideoBox::OnTrackerOption)
|
|
||||||
#endif
|
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
|
||||||
|
@ -275,46 +255,3 @@ void VideoBox::OnToggleRealtime(wxCommandEvent &event) {
|
||||||
Options.Save();
|
Options.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
///////////////////
|
|
||||||
// Tracker Menu
|
|
||||||
void VideoBox::OnVideoTrackerMenu(wxCommandEvent &event) {
|
|
||||||
wxMenu menu( _("FexTracker") );
|
|
||||||
AppendBitmapMenuItem(&menu, Video_Track_Points, _("Track points"), _T(""), wxBITMAP(button_track_points));
|
|
||||||
menu.AppendSeparator();
|
|
||||||
AppendBitmapMenuItem(&menu, Video_Track_Point_Add, _("Add points to movement"), _T(""), wxBITMAP(button_track_point_add));
|
|
||||||
AppendBitmapMenuItem(&menu, Video_Track_Point_Del, _("Remove points from movement"), _T(""), wxBITMAP(button_track_point_del));
|
|
||||||
menu.AppendSeparator();
|
|
||||||
AppendBitmapMenuItem(&menu, Video_Track_Movement, _("Generate movement from points"), _T(""), wxBITMAP(button_track_movement));
|
|
||||||
PopupMenu(&menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////
|
|
||||||
// Movement Menu
|
|
||||||
void VideoBox::OnVideoTrackerMenu2(wxCommandEvent &event) {
|
|
||||||
wxMenu menu( _("FexMovement") );
|
|
||||||
AppendBitmapMenuItem(&menu, Video_Track_Movement_Empty, _("Generate empty movement"), _T(""), wxBITMAP(button_track_move));
|
|
||||||
menu.AppendSeparator();
|
|
||||||
AppendBitmapMenuItem(&menu, Video_Track_Movement_MoveAll, _("Move subtitle"), _T(""), wxBITMAP(button_track_move));
|
|
||||||
menu.AppendSeparator();
|
|
||||||
AppendBitmapMenuItem(&menu, Video_Track_Movement_MoveBefore, _("Move subtitle (this frame and preceeding frames)"), _T(""), wxBITMAP(button_track_move));
|
|
||||||
AppendBitmapMenuItem(&menu, Video_Track_Movement_MoveOne, _("Move subtitle (this frame)"), _T(""), wxBITMAP(button_track_move));
|
|
||||||
AppendBitmapMenuItem(&menu, Video_Track_Movement_MoveAfter, _("Move subtitle (this frame and following frames)"), _T(""), wxBITMAP(button_track_move));
|
|
||||||
menu.AppendSeparator();
|
|
||||||
AppendBitmapMenuItem(&menu, Video_Track_Split_Line, _("Split line for movement"), _T(""), wxBITMAP(button_track_split_line));
|
|
||||||
menu.AppendSeparator();
|
|
||||||
AppendBitmapMenuItem(&menu, Video_Track_Link_File, _("Link movement file"), _T(""), wxBITMAP(button_track_move));
|
|
||||||
PopupMenu(&menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////
|
|
||||||
// Forward options
|
|
||||||
void VideoBox::OnTrackerOption(wxCommandEvent &event) {
|
|
||||||
videoDisplay->tracker->AddPendingEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -67,7 +67,6 @@
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "video_slider.h"
|
#include "video_slider.h"
|
||||||
#include "video_box.h"
|
#include "video_box.h"
|
||||||
#include "video_display_fextracker.h"
|
|
||||||
|
|
||||||
|
|
||||||
///////
|
///////
|
||||||
|
@ -117,10 +116,6 @@ VideoDisplay::VideoDisplay(wxWindow* parent, wxWindowID id, const wxPoint& pos,
|
||||||
zoomValue = 1.0;
|
zoomValue = 1.0;
|
||||||
freeSize = false;
|
freeSize = false;
|
||||||
visual = new VideoDisplayVisual(this);
|
visual = new VideoDisplayVisual(this);
|
||||||
tracker = NULL;
|
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
tracker = new VideoDisplayFexTracker(this);
|
|
||||||
#endif
|
|
||||||
SetCursor(wxNullCursor);
|
SetCursor(wxNullCursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,9 +124,6 @@ VideoDisplay::VideoDisplay(wxWindow* parent, wxWindowID id, const wxPoint& pos,
|
||||||
// Destructor
|
// Destructor
|
||||||
VideoDisplay::~VideoDisplay () {
|
VideoDisplay::~VideoDisplay () {
|
||||||
delete visual;
|
delete visual;
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
delete tracker;
|
|
||||||
#endif
|
|
||||||
VideoContext::Get()->RemoveDisplay(this);
|
VideoContext::Get()->RemoveDisplay(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -369,12 +361,6 @@ void VideoDisplay::OnMouseEvent(wxMouseEvent& event) {
|
||||||
// Disable when playing
|
// Disable when playing
|
||||||
if (VideoContext::Get()->IsPlaying()) return;
|
if (VideoContext::Get()->IsPlaying()) return;
|
||||||
|
|
||||||
// OnMouseLeave isn't called as long as we have an OnMouseEvent
|
|
||||||
// Just check for it and call it manually instead
|
|
||||||
if (event.Leaving()) {
|
|
||||||
if (tracker) tracker->bTrackerEditing = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Right click
|
// Right click
|
||||||
if (event.ButtonUp(wxMOUSE_BTN_RIGHT)) {
|
if (event.ButtonUp(wxMOUSE_BTN_RIGHT)) {
|
||||||
// Create menu
|
// Create menu
|
||||||
|
|
|
@ -56,7 +56,6 @@ class AudioDisplay;
|
||||||
class AssDialogue;
|
class AssDialogue;
|
||||||
class VideoProvider;
|
class VideoProvider;
|
||||||
class VideoDisplayVisual;
|
class VideoDisplayVisual;
|
||||||
class VideoDisplayFexTracker;
|
|
||||||
class VideoBox;
|
class VideoBox;
|
||||||
|
|
||||||
|
|
||||||
|
@ -86,7 +85,6 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
VideoDisplayVisual *visual;
|
VideoDisplayVisual *visual;
|
||||||
VideoDisplayFexTracker *tracker;
|
|
||||||
VideoBox *box;
|
VideoBox *box;
|
||||||
|
|
||||||
double zoomValue;
|
double zoomValue;
|
||||||
|
|
|
@ -1,434 +0,0 @@
|
||||||
// Copyright (c) 2005-2007, Rodrigo Braz Monteiro, Hajo Krabbenhöft
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer in the documentation
|
|
||||||
// and/or other materials provided with the distribution.
|
|
||||||
// * Neither the name of the Aegisub Group nor the names of its contributors
|
|
||||||
// may be used to endorse or promote products derived from this software
|
|
||||||
// without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// AEGISUB
|
|
||||||
//
|
|
||||||
// Website: http://aegisub.cellosoft.com
|
|
||||||
// Contact: mailto:zeratul@cellosoft.com
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////// HERE BE DRAGONS //////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
///////////
|
|
||||||
// Headers
|
|
||||||
#include "setup.h"
|
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
#include "video_display_fextracker.h"
|
|
||||||
#include "../FexTrackerSource/FexTracker.h"
|
|
||||||
#include "../FexTrackerSource/FexTrackingFeature.h"
|
|
||||||
#include "../FexTrackerSource/FexMovement.h"
|
|
||||||
#include "dialog_progress.h"
|
|
||||||
#include "dialog_fextracker.h"
|
|
||||||
#include "ass_dialogue.h"
|
|
||||||
#include "video_box.h"
|
|
||||||
#include "video_context.h"
|
|
||||||
#include "video_display.h"
|
|
||||||
#include "subs_grid.h"
|
|
||||||
#include "subs_edit_box.h"
|
|
||||||
#include "vfr.h"
|
|
||||||
#include "main.h"
|
|
||||||
#include "frame_main.h"
|
|
||||||
#include "video_provider.h"
|
|
||||||
#include "ass_file.h"
|
|
||||||
|
|
||||||
|
|
||||||
///////////////
|
|
||||||
// Event table
|
|
||||||
BEGIN_EVENT_TABLE(VideoDisplayFexTracker,wxEvtHandler)
|
|
||||||
EVT_MENU(Video_Track_Points, VideoDisplayFexTracker::OnVideoTrackPoints)
|
|
||||||
EVT_MENU(Video_Track_Point_Add, VideoDisplayFexTracker::OnVideoTrackPointAdd)
|
|
||||||
EVT_MENU(Video_Track_Point_Del, VideoDisplayFexTracker::OnVideoTrackPointDel)
|
|
||||||
EVT_MENU(Video_Track_Movement, VideoDisplayFexTracker::OnVideoTrackMovement)
|
|
||||||
EVT_MENU(Video_Track_Movement_MoveAll, VideoDisplayFexTracker::OnVideoTrackMovementMoveAll)
|
|
||||||
EVT_MENU(Video_Track_Movement_MoveOne, VideoDisplayFexTracker::OnVideoTrackMovementMoveOne)
|
|
||||||
EVT_MENU(Video_Track_Movement_MoveBefore, VideoDisplayFexTracker::OnVideoTrackMovementMoveBefore)
|
|
||||||
EVT_MENU(Video_Track_Movement_MoveAfter, VideoDisplayFexTracker::OnVideoTrackMovementMoveAfter)
|
|
||||||
EVT_MENU(Video_Track_Split_Line, VideoDisplayFexTracker::OnVideoTrackSplitLine)
|
|
||||||
EVT_MENU(Video_Track_Link_File, VideoDisplayFexTracker::OnVideoTrackLinkFile)
|
|
||||||
EVT_MENU(Video_Track_Movement_Empty, VideoDisplayFexTracker::OnVideoTrackMovementEmpty)
|
|
||||||
END_EVENT_TABLE()
|
|
||||||
|
|
||||||
|
|
||||||
///////////////
|
|
||||||
// Constructor
|
|
||||||
VideoDisplayFexTracker::VideoDisplayFexTracker(VideoDisplay *par) {
|
|
||||||
parent = par;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////
|
|
||||||
// Mouse event
|
|
||||||
void VideoDisplayFexTracker::OnMouseEvent(wxMouseEvent &event) {
|
|
||||||
// Variables
|
|
||||||
int frame_n = VideoContext::Get()->GetFrameN();
|
|
||||||
int dw,dh;
|
|
||||||
parent->GetClientSize(&dw,&dh);
|
|
||||||
int x = event.GetX();
|
|
||||||
int y = event.GetY();
|
|
||||||
int mx = x * VideoContext::Get()->GetWidth() / dw;
|
|
||||||
int my = y * VideoContext::Get()->GetHeight() / dh;
|
|
||||||
|
|
||||||
// Click
|
|
||||||
if (event.ButtonDown(wxMOUSE_BTN_LEFT)) {
|
|
||||||
MouseDownX = mx;
|
|
||||||
MouseDownY = my;
|
|
||||||
bTrackerEditing = 1;
|
|
||||||
}
|
|
||||||
if (event.ButtonUp(wxMOUSE_BTN_LEFT)) bTrackerEditing = 0;
|
|
||||||
|
|
||||||
// Do tracker influence if needed
|
|
||||||
if( bTrackerEditing ) {
|
|
||||||
AssDialogue *curline = VideoContext::Get()->grid->GetDialogue(VideoContext::Get()->grid->editBox->linen);
|
|
||||||
int StartFrame, EndFrame, localframe;
|
|
||||||
|
|
||||||
// Visible?
|
|
||||||
if (curline && (StartFrame = VFR_Output.GetFrameAtTime(curline->Start.GetMS(),true)) <= frame_n && (EndFrame = VFR_Output.GetFrameAtTime(curline->End.GetMS(),false)) >= frame_n ) {
|
|
||||||
localframe = frame_n - StartFrame;
|
|
||||||
if (TrackerEdit!=0 && curline->Tracker && localframe < curline->Tracker->GetFrame())
|
|
||||||
curline->Tracker->InfluenceFeatures (localframe, float(mx), float(my), TrackerEdit);
|
|
||||||
if (MovementEdit!=0 && curline->Movement && localframe < curline->Movement->Frames.size()) {
|
|
||||||
// Set start/end
|
|
||||||
int movMode = MovementEdit;
|
|
||||||
int start = 0;
|
|
||||||
int end = localframe+1;
|
|
||||||
if (movMode == 2 || movMode == 4) start = localframe;
|
|
||||||
if (movMode == 1 || movMode == 4) end = curline->Movement->Frames.size();
|
|
||||||
|
|
||||||
// Apply
|
|
||||||
for (int i=0;i<curline->Movement->Frames.size();i++) {
|
|
||||||
curline->Movement->Frames[i].Pos.x += float(mx-MouseDownX);
|
|
||||||
curline->Movement->Frames[i].Pos.y += float(my-MouseDownY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MouseDownX = mx;
|
|
||||||
MouseDownY = my;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////
|
|
||||||
// Draw tracking overlay
|
|
||||||
void VideoDisplayFexTracker::Render() {
|
|
||||||
int frame_n = VideoContext::Get()->GetFrameN();
|
|
||||||
|
|
||||||
// Get line
|
|
||||||
AssDialogue *curline = VideoContext::Get()->grid->GetDialogue(VideoContext::Get()->grid->editBox->linen);
|
|
||||||
if (!curline) return;
|
|
||||||
|
|
||||||
int StartFrame = VFR_Output.GetFrameAtTime(curline->Start.GetMS(),true);
|
|
||||||
int EndFrame = VFR_Output.GetFrameAtTime(curline->End.GetMS(),false);
|
|
||||||
if (frame_n<StartFrame || frame_n>EndFrame) return;
|
|
||||||
|
|
||||||
int localframe = frame_n - StartFrame;
|
|
||||||
|
|
||||||
if (curline->Tracker) {
|
|
||||||
if (curline->Tracker->GetFrame() <= localframe) return;
|
|
||||||
|
|
||||||
// Draw ticks
|
|
||||||
for (int i=0;i<curline->Tracker->GetCount();i++) {
|
|
||||||
FexTrackingFeature* f = (*curline->Tracker)[i];
|
|
||||||
if (f->StartTime > localframe) continue;
|
|
||||||
int llf = localframe - f->StartTime;
|
|
||||||
if (f->Pos.size() <= llf) continue;
|
|
||||||
vec2 pt = f->Pos[llf];
|
|
||||||
|
|
||||||
SetLineColour(wxColour(255*(1-f->Influence),255*f->Influence,0),1);
|
|
||||||
|
|
||||||
DrawLine (pt.x-2, pt.y, pt.x, pt.y);
|
|
||||||
DrawLine (pt.x, pt.y-2, pt.x, pt.y);
|
|
||||||
DrawLine (pt.x+1, pt.y, pt.x+3, pt.y);
|
|
||||||
DrawLine (pt.x, pt.y+1, pt.x, pt.y+3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (curline->Movement) {
|
|
||||||
if (curline->Movement->Frames.size() <= localframe) return;
|
|
||||||
|
|
||||||
FexMovementFrame f = curline->Movement->Frames.lVal[localframe];
|
|
||||||
f.Scale.x *= 30;
|
|
||||||
f.Scale.y *= 30;
|
|
||||||
|
|
||||||
FexMovementFrame f3 = f;
|
|
||||||
SetLineColour(wxColour(0,0,255),1);
|
|
||||||
int nBack = 8;
|
|
||||||
while (--localframe>0 && nBack-- >0) {
|
|
||||||
FexMovementFrame f2 = curline->Movement->Frames.lVal[localframe];
|
|
||||||
DrawLine (f2.Pos.x, f2.Pos.y, f3.Pos.x, f3.Pos.y);
|
|
||||||
f3 = f2;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetLineColour(wxColour(200,0,0),2);
|
|
||||||
DrawLine (f.Pos.x-f.Scale.x, f.Pos.y, f.Pos.x+f.Scale.x+1, f.Pos.y);
|
|
||||||
DrawLine (f.Pos.x, f.Pos.y-f.Scale.y, f.Pos.x, f.Pos.y+f.Scale.y+1);
|
|
||||||
|
|
||||||
f3 = f;
|
|
||||||
SetLineColour(wxColour(0,255,0),1);
|
|
||||||
int nFront = 8;
|
|
||||||
localframe = frame_n - StartFrame;
|
|
||||||
while( ++localframe<curline->Movement->Frames.size() && nFront-- >0 ) {
|
|
||||||
FexMovementFrame f2 = curline->Movement->Frames.lVal[localframe];
|
|
||||||
DrawLine (f2.Pos.x, f2.Pos.y, f3.Pos.x, f3.Pos.y);
|
|
||||||
f3 = f2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////
|
|
||||||
// Track current line
|
|
||||||
void VideoDisplayFexTracker::OnVideoTrackPoints(wxCommandEvent &event) {
|
|
||||||
VideoContext::Get()->Stop();
|
|
||||||
|
|
||||||
// Get line
|
|
||||||
FrameMain *frame = AegisubApp::Get()->frame;
|
|
||||||
AssDialogue *curline = frame->SubsBox->GetDialogue(frame->EditBox->linen);
|
|
||||||
if (!curline) return;
|
|
||||||
|
|
||||||
FexTrackerConfig config;
|
|
||||||
DialogFexTracker configDlg (frame, &config);
|
|
||||||
configDlg.ShowModal();
|
|
||||||
|
|
||||||
if (!config.FeatureNumber) return;
|
|
||||||
|
|
||||||
// Get Video
|
|
||||||
VideoProvider *movie = VideoProviderFactory::GetProvider(VideoContext::Get()->videoName);
|
|
||||||
|
|
||||||
// Create Tracker
|
|
||||||
if( curline->Tracker ) delete curline->Tracker;
|
|
||||||
curline->Tracker = new FexTracker( movie->GetWidth(), movie->GetHeight(), config.FeatureNumber );
|
|
||||||
curline->Tracker->minFeatures = config.FeatureNumber;
|
|
||||||
curline->Tracker->Cfg = config;
|
|
||||||
|
|
||||||
// Start progress
|
|
||||||
volatile bool canceled = false;
|
|
||||||
DialogProgress *progress = new DialogProgress(frame,_("FexTracker"),&canceled,_("Tracking points"),0,1);
|
|
||||||
progress->Show();
|
|
||||||
|
|
||||||
// Allocate temp image
|
|
||||||
float* FloatImg = new float[ movie->GetWidth()*movie->GetHeight() ];
|
|
||||||
|
|
||||||
int StartFrame = VFR_Output.GetFrameAtTime(curline->Start.GetMS(),true);
|
|
||||||
int EndFrame = VFR_Output.GetFrameAtTime(curline->End.GetMS(),false);
|
|
||||||
|
|
||||||
for( int Frame = StartFrame; Frame <= EndFrame; Frame ++ )
|
|
||||||
{
|
|
||||||
progress->SetProgress( Frame-StartFrame, EndFrame-StartFrame );
|
|
||||||
if( canceled ) break;
|
|
||||||
|
|
||||||
movie->GetFloatFrame( FloatImg, Frame );
|
|
||||||
curline->Tracker->ProcessImage( FloatImg );
|
|
||||||
}
|
|
||||||
|
|
||||||
delete FloatImg;
|
|
||||||
delete movie;
|
|
||||||
|
|
||||||
// Clean up progress
|
|
||||||
if (!canceled)
|
|
||||||
progress->Destroy();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
delete curline->Tracker;
|
|
||||||
curline->Tracker = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
VideoContext::Get()->Refresh(true,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////
|
|
||||||
// Track current line
|
|
||||||
void VideoDisplayFexTracker::OnVideoTrackMovement(wxCommandEvent &event) {
|
|
||||||
VideoContext::Get()->Stop();
|
|
||||||
|
|
||||||
// Get line
|
|
||||||
FrameMain *frame = AegisubApp::Get()->frame;
|
|
||||||
AssDialogue *curline = frame->SubsBox->GetDialogue(frame->EditBox->linen);
|
|
||||||
if (!curline) return;
|
|
||||||
if( !curline->Tracker ) return;
|
|
||||||
|
|
||||||
// Create Movement
|
|
||||||
if( curline->Movement ) DeleteMovement( curline->Movement );
|
|
||||||
curline->Movement = curline->Tracker->GetMovement();
|
|
||||||
|
|
||||||
VideoContext::Get()->Refresh(true,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////
|
|
||||||
// split current line
|
|
||||||
void VideoDisplayFexTracker::OnVideoTrackSplitLine(wxCommandEvent &event) {
|
|
||||||
VideoContext::Get()->Stop();
|
|
||||||
|
|
||||||
// Get line
|
|
||||||
FrameMain *frame = AegisubApp::Get()->frame;
|
|
||||||
AssDialogue *curline = frame->SubsBox->GetDialogue(frame->EditBox->linen);
|
|
||||||
if (!curline) return;
|
|
||||||
if( !curline->Movement ) return;
|
|
||||||
|
|
||||||
// Create split lines
|
|
||||||
int StartFrame = VFR_Output.GetFrameAtTime(curline->Start.GetMS(),true);
|
|
||||||
int EndFrame = VFR_Output.GetFrameAtTime(curline->End.GetMS(),false);
|
|
||||||
|
|
||||||
AssFile *subs = AssFile::top;
|
|
||||||
int ResXValue,ResYValue;
|
|
||||||
swscanf( subs->GetScriptInfo(_T("PlayResX")), _T("%d"), &ResXValue );
|
|
||||||
swscanf( subs->GetScriptInfo(_T("PlayResY")), _T("%d"), &ResYValue );
|
|
||||||
int SrcXValue = VideoContext::Get()->GetWidth();
|
|
||||||
int SrcYValue = VideoContext::Get()->GetHeight();
|
|
||||||
|
|
||||||
float sx = float(ResXValue)/float(SrcXValue);
|
|
||||||
float sy = float(ResYValue)/float(SrcYValue);
|
|
||||||
|
|
||||||
for( int Frame = StartFrame; Frame < EndFrame; Frame ++ )
|
|
||||||
{
|
|
||||||
int localframe = Frame - StartFrame;
|
|
||||||
|
|
||||||
while( curline->Movement->Frames.size() <= localframe ) localframe--;
|
|
||||||
FexMovementFrame f = curline->Movement->Frames[localframe];
|
|
||||||
// f.Pos.x /= videoDisplay->GetW
|
|
||||||
|
|
||||||
AssDialogue *cur = new AssDialogue( curline->GetEntryData() );
|
|
||||||
cur->Start.SetMS(VFR_Output.GetTimeAtFrame(Frame,true));
|
|
||||||
cur->End.SetMS(VFR_Output.GetTimeAtFrame(Frame,false));
|
|
||||||
cur->Text = wxString::Format( _T("{\\pos(%.0f,%.0f)\\fscx%.2f\\fscy%.2f}"), f.Pos.x*sx, f.Pos.y*sy, f.Scale.x*100, f.Scale.y*100 ) + cur->Text;
|
|
||||||
cur->UpdateData();
|
|
||||||
|
|
||||||
frame->SubsBox->InsertLine(cur,frame->EditBox->linen + Frame - StartFrame,true,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove Movement
|
|
||||||
DeleteMovement( curline->Movement );
|
|
||||||
curline->Movement = 0;
|
|
||||||
|
|
||||||
// Remove Tracker
|
|
||||||
delete curline->Tracker;
|
|
||||||
curline->Tracker = 0;
|
|
||||||
|
|
||||||
// Remove this line
|
|
||||||
frame->SubsBox->DeleteLines(frame->SubsBox->GetRangeArray(frame->EditBox->linen, frame->EditBox->linen));
|
|
||||||
|
|
||||||
VideoContext::Get()->Refresh(true,false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////
|
|
||||||
// generate empty movement
|
|
||||||
void VideoDisplayFexTracker::OnVideoTrackMovementEmpty(wxCommandEvent &event) {
|
|
||||||
// Get line
|
|
||||||
FrameMain *frame = AegisubApp::Get()->frame;
|
|
||||||
AssDialogue *curline = frame->SubsBox->GetDialogue(frame->EditBox->linen);
|
|
||||||
if (!curline) return;
|
|
||||||
if( curline->Movement ) DeleteMovement( curline->Movement );
|
|
||||||
curline->Movement = CreateMovement();
|
|
||||||
|
|
||||||
// Create split lines
|
|
||||||
int StartFrame = VFR_Output.GetFrameAtTime(curline->Start.GetMS(),true);
|
|
||||||
int EndFrame = VFR_Output.GetFrameAtTime(curline->End.GetMS(),false);
|
|
||||||
|
|
||||||
FexMovementFrame f;
|
|
||||||
memset( &f, 0x00, sizeof(f) );
|
|
||||||
f.Scale.x = f.Scale.y = 1;
|
|
||||||
|
|
||||||
for( int i=StartFrame;i<EndFrame;i++ )
|
|
||||||
curline->Movement->Frames.Add( f );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////
|
|
||||||
// link line to move file
|
|
||||||
void VideoDisplayFexTracker::OnVideoTrackLinkFile(wxCommandEvent &event) {
|
|
||||||
VideoContext::Get()->Stop();
|
|
||||||
|
|
||||||
// Get line
|
|
||||||
FrameMain *frame = AegisubApp::Get()->frame;
|
|
||||||
AssDialogue *curline = frame->SubsBox->GetDialogue(frame->EditBox->linen);
|
|
||||||
if (!curline) return;
|
|
||||||
|
|
||||||
wxString link = wxGetTextFromUser(_("Link name:"), _("Link line to movement file"), curline->Movement?curline->Movement->FileName:_T(""), frame);
|
|
||||||
if( link.empty() ) curline->Effect = _T("");
|
|
||||||
else curline->Effect = _T("FexMovement:")+link;
|
|
||||||
|
|
||||||
curline->UpdateData();
|
|
||||||
|
|
||||||
if( !curline->Effect.empty() && curline->Movement )
|
|
||||||
SaveMovement( curline->Movement, curline->Effect.AfterFirst(':').c_str() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////
|
|
||||||
// Increase Influence
|
|
||||||
void VideoDisplayFexTracker::OnVideoTrackPointAdd(wxCommandEvent &event) {
|
|
||||||
TrackerEdit = 1;
|
|
||||||
bTrackerEditing = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////
|
|
||||||
// Decrease Influence
|
|
||||||
void VideoDisplayFexTracker::OnVideoTrackPointDel(wxCommandEvent &event) {
|
|
||||||
TrackerEdit = -1;
|
|
||||||
bTrackerEditing = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////
|
|
||||||
// Move All
|
|
||||||
void VideoDisplayFexTracker::OnVideoTrackMovementMoveAll(wxCommandEvent &event) {
|
|
||||||
MovementEdit = 1;
|
|
||||||
bTrackerEditing = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////
|
|
||||||
// Move One
|
|
||||||
void VideoDisplayFexTracker::OnVideoTrackMovementMoveOne(wxCommandEvent &event) {
|
|
||||||
MovementEdit = 2;
|
|
||||||
bTrackerEditing = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////
|
|
||||||
// Move Before
|
|
||||||
void VideoDisplayFexTracker::OnVideoTrackMovementMoveBefore(wxCommandEvent &event) {
|
|
||||||
MovementEdit = 3;
|
|
||||||
bTrackerEditing = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//////////////
|
|
||||||
// Move After
|
|
||||||
void VideoDisplayFexTracker::OnVideoTrackMovementMoveAfter(wxCommandEvent &event) {
|
|
||||||
MovementEdit = 4;
|
|
||||||
bTrackerEditing = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,79 +0,0 @@
|
||||||
// Copyright (c) 2005-2007, Rodrigo Braz Monteiro, Hajo Krabbenhöft
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer in the documentation
|
|
||||||
// and/or other materials provided with the distribution.
|
|
||||||
// * Neither the name of the Aegisub Group nor the names of its contributors
|
|
||||||
// may be used to endorse or promote products derived from this software
|
|
||||||
// without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// AEGISUB
|
|
||||||
//
|
|
||||||
// Website: http://aegisub.cellosoft.com
|
|
||||||
// Contact: mailto:zeratul@cellosoft.com
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
|
|
||||||
///////////
|
|
||||||
// Headers
|
|
||||||
#include "gl_wrap.h"
|
|
||||||
|
|
||||||
|
|
||||||
//////////////
|
|
||||||
// Prototypes
|
|
||||||
class VideoDisplay;
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////
|
|
||||||
// Fex tracker video interface
|
|
||||||
class VideoDisplayFexTracker : public wxEvtHandler, public OpenGLWrapper {
|
|
||||||
public:
|
|
||||||
bool bTrackerEditing;
|
|
||||||
int MovementEdit;
|
|
||||||
double TrackerEdit;
|
|
||||||
int MouseDownX, MouseDownY;
|
|
||||||
|
|
||||||
VideoDisplay *parent;
|
|
||||||
|
|
||||||
VideoDisplayFexTracker(VideoDisplay *parent);
|
|
||||||
|
|
||||||
void OnMouseEvent(wxMouseEvent &event);
|
|
||||||
void Render();
|
|
||||||
|
|
||||||
void OnVideoTrackPoints(wxCommandEvent &event);
|
|
||||||
void OnVideoTrackPointAdd(wxCommandEvent &event);
|
|
||||||
void OnVideoTrackPointDel(wxCommandEvent &event);
|
|
||||||
void OnVideoTrackMovement(wxCommandEvent &event);
|
|
||||||
void OnVideoTrackMovementMoveAll(wxCommandEvent &event);
|
|
||||||
void OnVideoTrackMovementMoveOne(wxCommandEvent &event);
|
|
||||||
void OnVideoTrackMovementMoveBefore(wxCommandEvent &event);
|
|
||||||
void OnVideoTrackMovementMoveAfter(wxCommandEvent &event);
|
|
||||||
void OnVideoTrackSplitLine(wxCommandEvent &event);
|
|
||||||
void OnVideoTrackLinkFile(wxCommandEvent &event);
|
|
||||||
void OnVideoTrackMovementEmpty(wxCommandEvent &event);
|
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
|
||||||
};
|
|
|
@ -40,7 +40,6 @@
|
||||||
#include <GL/glu.h>
|
#include <GL/glu.h>
|
||||||
#include <wx/wxprec.h>
|
#include <wx/wxprec.h>
|
||||||
#include "video_display_visual.h"
|
#include "video_display_visual.h"
|
||||||
#include "video_display_fextracker.h"
|
|
||||||
#include "video_display.h"
|
#include "video_display.h"
|
||||||
#include "video_provider.h"
|
#include "video_provider.h"
|
||||||
#include "vfr.h"
|
#include "vfr.h"
|
||||||
|
@ -103,12 +102,6 @@ void VideoDisplayVisual::DrawOverlay() {
|
||||||
int mx = mouseX * sw / w;
|
int mx = mouseX * sw / w;
|
||||||
int my = mouseY * sh / h;
|
int my = mouseY * sh / h;
|
||||||
|
|
||||||
// Draw the control points for FexTracker
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
parent->tracker->Render();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Draw lines
|
// Draw lines
|
||||||
if (mode != 0) {
|
if (mode != 0) {
|
||||||
int numRows = VideoContext::Get()->grid->GetRows();
|
int numRows = VideoContext::Get()->grid->GetRows();
|
||||||
|
@ -769,11 +762,6 @@ void VideoDisplayVisual::OnMouseEvent (wxMouseEvent &event) {
|
||||||
bool hasOverlay = false;
|
bool hasOverlay = false;
|
||||||
bool realTime = Options.AsBool(_T("Video Visual Realtime"));
|
bool realTime = Options.AsBool(_T("Video Visual Realtime"));
|
||||||
|
|
||||||
// Fextracker
|
|
||||||
#if USE_FEXTRACKER == 1
|
|
||||||
if (parent->tracker) parent->tracker->OnMouseEvent(event);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Text of current coords
|
// Text of current coords
|
||||||
int vx = (sw * x + w/2) / w;
|
int vx = (sw * x + w/2) / w;
|
||||||
int vy = (sh * y + h/2) / h;
|
int vy = (sh * y + h/2) / h;
|
||||||
|
|
|
@ -231,7 +231,6 @@ AC_OUTPUT([
|
||||||
ac/Makefile
|
ac/Makefile
|
||||||
auto3/Makefile
|
auto3/Makefile
|
||||||
automation/Makefile
|
automation/Makefile
|
||||||
FexTrackerSource/Makefile
|
|
||||||
locale/Makefile
|
locale/Makefile
|
||||||
aegisub/Makefile
|
aegisub/Makefile
|
||||||
aegisub/bitmaps/Makefile
|
aegisub/bitmaps/Makefile
|
||||||
|
|
Loading…
Reference in a new issue