diff --git a/extern/libmv/libmv-capi.cpp b/extern/libmv/libmv-capi.cpp index 4c6c8824c31..11c77deceba 100644 --- a/extern/libmv/libmv-capi.cpp +++ b/extern/libmv/libmv-capi.cpp @@ -546,13 +546,14 @@ void libmv_destroyFeatures(struct libmv_Features *libmv_features) /* ************ camera intrinsics ************ */ struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsNew(double focal_length, double principal_x, double principal_y, - double k1, double k2, double k3) + double k1, double k2, double k3, int width, int height) { libmv::CameraIntrinsics *intrinsics= new libmv::CameraIntrinsics(); intrinsics->SetFocalLength(focal_length, focal_length); intrinsics->SetPrincipalPoint(principal_x, principal_y); intrinsics->SetRadialDistortion(k1, k2, k3); + intrinsics->SetImageSize(width, height); return (struct libmv_CameraIntrinsics *) intrinsics; } @@ -565,7 +566,7 @@ void libmv_CameraIntrinsicsDestroy(struct libmv_CameraIntrinsics *libmvIntrinsic } void libmv_CameraIntrinsicsUpdate(struct libmv_CameraIntrinsics *libmvIntrinsics, double focal_length, - double principal_x, double principal_y, double k1, double k2, double k3) + double principal_x, double principal_y, double k1, double k2, double k3, int width, int height) { libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics; @@ -577,6 +578,9 @@ void libmv_CameraIntrinsicsUpdate(struct libmv_CameraIntrinsics *libmvIntrinsics if (intrinsics->k1() != k1 || intrinsics->k2() != k2 || intrinsics->k3() != k3) intrinsics->SetRadialDistortion(k1, k2, k3); + + if (intrinsics->image_width() != width || intrinsics->image_height() != height) + intrinsics->SetImageSize(width, height); } void libmv_CameraIntrinsicsUndistortByte(struct libmv_CameraIntrinsics *libmvIntrinsics, @@ -584,9 +588,6 @@ void libmv_CameraIntrinsicsUndistortByte(struct libmv_CameraIntrinsics *libmvInt { libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics; - if (intrinsics->image_width() != width || intrinsics->image_height() != height) - intrinsics->SetImageSize(width, height); - intrinsics->Undistort(src, dst, width, height, channels); } @@ -595,9 +596,6 @@ void libmv_CameraIntrinsicsUndistortFloat(struct libmv_CameraIntrinsics *libmvIn { libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics; - if (intrinsics->image_width() != width || intrinsics->image_height() != height) - intrinsics->SetImageSize(width, height); - intrinsics->Undistort(src, dst, width, height, channels); } @@ -605,10 +603,6 @@ void libmv_CameraIntrinsicsDistortByte(struct libmv_CameraIntrinsics *libmvIntri unsigned char *src, unsigned char *dst, int width, int height, int channels) { libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics; - - if (intrinsics->image_width() != width || intrinsics->image_height() != height) - intrinsics->SetImageSize(width, height); - intrinsics->Distort(src, dst, width, height, channels); } @@ -617,9 +611,6 @@ void libmv_CameraIntrinsicsDistortFloat(struct libmv_CameraIntrinsics *libmvIntr { libmv::CameraIntrinsics *intrinsics = (libmv::CameraIntrinsics *) libmvIntrinsics; - if (intrinsics->image_width() != width || intrinsics->image_height() != height) - intrinsics->SetImageSize(width, height); - intrinsics->Distort(src, dst, width, height, channels); } diff --git a/extern/libmv/libmv-capi.h b/extern/libmv/libmv-capi.h index 39e1a986dcf..137759bc347 100644 --- a/extern/libmv/libmv-capi.h +++ b/extern/libmv/libmv-capi.h @@ -80,12 +80,12 @@ void libmv_destroyFeatures(struct libmv_Features *libmv_features); /* camera intrinsics */ struct libmv_CameraIntrinsics *libmv_CameraIntrinsicsNew(double focal_length, double principal_x, double principal_y, - double k1, double k2, double k3); + double k1, double k2, double k3, int width, int height); void libmv_CameraIntrinsicsDestroy(struct libmv_CameraIntrinsics *libmvIntrinsics); void libmv_CameraIntrinsicsUpdate(struct libmv_CameraIntrinsics *libmvIntrinsics, double focal_length, - double principal_x, double principal_y, double k1, double k2, double k3); + double principal_x, double principal_y, double k1, double k2, double k3, int width, int height); void libmv_CameraIntrinsicsUndistortByte(struct libmv_CameraIntrinsics *libmvIntrinsics, unsigned char *src, unsigned char *dst, int width, int height, int channels); diff --git a/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc b/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc index f9888ff3ae6..e1e6117e2e2 100644 --- a/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc +++ b/extern/libmv/libmv/simple_pipeline/camera_intrinsics.cc @@ -24,6 +24,7 @@ namespace libmv { struct Offset { signed char ix,iy; unsigned char fx,fy; }; +struct Grid { struct Offset *offset; int width, height; }; CameraIntrinsics::CameraIntrinsics() : K_(Mat3::Identity()), @@ -38,8 +39,7 @@ CameraIntrinsics::CameraIntrinsics() undistort_(0) {} CameraIntrinsics::~CameraIntrinsics() { - if(distort_) delete[] distort_; - if(undistort_) delete[] undistort_; + FreeLookupGrid(); } /// Set the entire calibration matrix at once. @@ -146,11 +146,17 @@ void CameraIntrinsics::InvertIntrinsics(double image_x, // TODO(MatthiasF): downsample lookup template -void CameraIntrinsics::ComputeLookupGrid(Offset* grid, int width, int height) { +void CameraIntrinsics::ComputeLookupGrid(Grid* grid, int width, int height) { + double aspx = (double)width / image_width_; + double aspy = (double)height / image_height_; + for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { + double src_x = x / aspx, src_y = y / aspy; double warp_x, warp_y; - WarpFunction(this,x,y,&warp_x,&warp_y); + WarpFunction(this,src_x,src_y,&warp_x,&warp_y); + warp_x *= aspx; + warp_y *= aspy; int ix = int(warp_x), iy = int(warp_y); int fx = round((warp_x-ix)*256), fy = round((warp_y-iy)*256); if(fx == 256) { fx=0; ix++; } @@ -162,10 +168,10 @@ void CameraIntrinsics::ComputeLookupGrid(Offset* grid, int width, int height) { if( iy >= height-2 ) iy = height-2; if ( ix-x > -128 && ix-x < 128 && iy-y > -128 && iy-y < 128 ) { Offset offset = { ix-x, iy-y, fx, fy }; - grid[y*width+x] = offset; + grid->offset[y*width+x] = offset; } else { Offset offset = { 0, 0, 0, 0 }; - grid[y*width+x] = offset; + grid->offset[y*width+x] = offset; } } } @@ -173,11 +179,11 @@ void CameraIntrinsics::ComputeLookupGrid(Offset* grid, int width, int height) { // TODO(MatthiasF): cubic B-Spline image sampling, bilinear lookup template -static void Warp(const Offset* grid, const T* src, T* dst, +static void Warp(const Grid* grid, const T* src, T* dst, int width, int height) { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - Offset offset = grid[y*width+x]; + Offset offset = grid->offset[y*width+x]; const T* s = &src[((y+offset.iy)*width+(x+offset.ix))*N]; for (int i = 0; i < N; i++) { dst[(y*width+x)*N+i] = ((s[ i] * (256-offset.fx) + s[ N+i] * offset.fx) * (256-offset.fy) @@ -188,8 +194,17 @@ static void Warp(const Offset* grid, const T* src, T* dst, } void CameraIntrinsics::FreeLookupGrid() { - if(distort_) delete distort_, distort_=0; - if(undistort_) delete undistort_, undistort_=0; + if(distort_) { + delete distort_; + delete distort_->offset; + distort_ = NULL; + } + + if(undistort_) { + delete undistort_; + delete undistort_->offset; + undistort_ = NULL; + } } // FIXME: C++ templates limitations makes thing complicated, but maybe there is a simpler method. @@ -211,11 +226,50 @@ struct InvertIntrinsicsFunction { } }; -void CameraIntrinsics::Distort(const float* src, float* dst, int width, int height, int channels) { - if(!distort_) { - distort_ = new Offset[width*height]; - ComputeLookupGrid(distort_,width,height); +void CameraIntrinsics::CheckDistortLookupGrid(int width, int height) +{ + if(distort_) { + if(distort_->width != width || distort_->height != height) { + delete [] distort_->offset; + distort_->offset = NULL; + } + } else { + distort_ = new Grid; + distort_->offset = NULL; } + + if(!distort_->offset) { + distort_->offset = new Offset[width*height]; + ComputeLookupGrid(distort_,width,height); + } + + distort_->width = width; + distort_->height = height; +} + +void CameraIntrinsics::CheckUndistortLookupGrid(int width, int height) +{ + if(undistort_) { + if(undistort_->width != width || undistort_->height != height) { + delete [] undistort_->offset; + undistort_->offset = NULL; + } + } else { + undistort_ = new Grid; + undistort_->offset = NULL; + } + + if(!undistort_->offset) { + undistort_->offset = new Offset[width*height]; + ComputeLookupGrid(undistort_,width,height); + } + + undistort_->width = width; + undistort_->height = height; +} + +void CameraIntrinsics::Distort(const float* src, float* dst, int width, int height, int channels) { + CheckDistortLookupGrid(width, height); if(channels==1) Warp(distort_,src,dst,width,height); else if(channels==2) Warp(distort_,src,dst,width,height); else if(channels==3) Warp(distort_,src,dst,width,height); @@ -224,10 +278,7 @@ void CameraIntrinsics::Distort(const float* src, float* dst, int width, int heig } void CameraIntrinsics::Distort(const unsigned char* src, unsigned char* dst, int width, int height, int channels) { - if(!distort_) { - distort_ = new Offset[width*height]; - ComputeLookupGrid(distort_,width,height); - } + CheckDistortLookupGrid(width, height); if(channels==1) Warp(distort_,src,dst,width,height); else if(channels==2) Warp(distort_,src,dst,width,height); else if(channels==3) Warp(distort_,src,dst,width,height); @@ -236,10 +287,7 @@ void CameraIntrinsics::Distort(const unsigned char* src, unsigned char* dst, int } void CameraIntrinsics::Undistort(const float* src, float* dst, int width, int height, int channels) { - if(!undistort_) { - undistort_ = new Offset[width*height]; - ComputeLookupGrid(undistort_,width,height); - } + CheckUndistortLookupGrid(width, height); if(channels==1) Warp(undistort_,src,dst,width,height); else if(channels==2) Warp(undistort_,src,dst,width,height); else if(channels==3) Warp(undistort_,src,dst,width,height); @@ -248,10 +296,7 @@ void CameraIntrinsics::Undistort(const float* src, float* dst, int width, int he } void CameraIntrinsics::Undistort(const unsigned char* src, unsigned char* dst, int width, int height, int channels) { - if(!undistort_) { - undistort_ = new Offset[width*height]; - ComputeLookupGrid(undistort_,width,height); - } + CheckUndistortLookupGrid(width, height); if(channels==1) Warp(undistort_,src,dst,width,height); else if(channels==2) Warp(undistort_,src,dst,width,height); else if(channels==3) Warp(undistort_,src,dst,width,height); diff --git a/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h b/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h index 29bc8a1cea4..99141c61bfc 100644 --- a/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h +++ b/extern/libmv/libmv/simple_pipeline/camera_intrinsics.h @@ -26,8 +26,6 @@ typedef Eigen::Matrix Mat3; namespace libmv { -struct Offset; - class CameraIntrinsics { public: CameraIntrinsics(); @@ -123,7 +121,9 @@ class CameraIntrinsics { int width, int height, int channels); private: - template void ComputeLookupGrid(Offset* grid, int width, int height); + template void ComputeLookupGrid(struct Grid* grid, int width, int height); + void CheckUndistortLookupGrid(int width, int height); + void CheckDistortLookupGrid(int width, int height); void FreeLookupGrid(); // The traditional intrinsics matrix from x = K[R|t]X. @@ -140,8 +140,8 @@ class CameraIntrinsics { // independent of image size. double k1_, k2_, k3_, p1_, p2_; - Offset* distort_; - Offset* undistort_; + struct Grid *distort_; + struct Grid *undistort_; }; } // namespace libmv diff --git a/extern/libmv/patches/scaled_distortion.patch b/extern/libmv/patches/scaled_distortion.patch new file mode 100644 index 00000000000..5088c6725c9 --- /dev/null +++ b/extern/libmv/patches/scaled_distortion.patch @@ -0,0 +1,215 @@ +diff --git a/src/libmv/simple_pipeline/camera_intrinsics.cc b/src/libmv/simple_pipeline/camera_intrinsics.cc +index f9888ff..e1e6117 100644 +--- a/src/libmv/simple_pipeline/camera_intrinsics.cc ++++ b/src/libmv/simple_pipeline/camera_intrinsics.cc +@@ -24,6 +24,7 @@ + namespace libmv { + + struct Offset { signed char ix,iy; unsigned char fx,fy; }; ++struct Grid { struct Offset *offset; int width, height; }; + + CameraIntrinsics::CameraIntrinsics() + : K_(Mat3::Identity()), +@@ -38,8 +39,7 @@ CameraIntrinsics::CameraIntrinsics() + undistort_(0) {} + + CameraIntrinsics::~CameraIntrinsics() { +- if(distort_) delete[] distort_; +- if(undistort_) delete[] undistort_; ++ FreeLookupGrid(); + } + + /// Set the entire calibration matrix at once. +@@ -146,11 +146,17 @@ void CameraIntrinsics::InvertIntrinsics(double image_x, + + // TODO(MatthiasF): downsample lookup + template +-void CameraIntrinsics::ComputeLookupGrid(Offset* grid, int width, int height) { ++void CameraIntrinsics::ComputeLookupGrid(Grid* grid, int width, int height) { ++ double aspx = (double)width / image_width_; ++ double aspy = (double)height / image_height_; ++ + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { ++ double src_x = x / aspx, src_y = y / aspy; + double warp_x, warp_y; +- WarpFunction(this,x,y,&warp_x,&warp_y); ++ WarpFunction(this,src_x,src_y,&warp_x,&warp_y); ++ warp_x *= aspx; ++ warp_y *= aspy; + int ix = int(warp_x), iy = int(warp_y); + int fx = round((warp_x-ix)*256), fy = round((warp_y-iy)*256); + if(fx == 256) { fx=0; ix++; } +@@ -162,10 +168,10 @@ void CameraIntrinsics::ComputeLookupGrid(Offset* grid, int width, int height) { + if( iy >= height-2 ) iy = height-2; + if ( ix-x > -128 && ix-x < 128 && iy-y > -128 && iy-y < 128 ) { + Offset offset = { ix-x, iy-y, fx, fy }; +- grid[y*width+x] = offset; ++ grid->offset[y*width+x] = offset; + } else { + Offset offset = { 0, 0, 0, 0 }; +- grid[y*width+x] = offset; ++ grid->offset[y*width+x] = offset; + } + } + } +@@ -173,11 +179,11 @@ void CameraIntrinsics::ComputeLookupGrid(Offset* grid, int width, int height) { + + // TODO(MatthiasF): cubic B-Spline image sampling, bilinear lookup + template +-static void Warp(const Offset* grid, const T* src, T* dst, ++static void Warp(const Grid* grid, const T* src, T* dst, + int width, int height) { + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { +- Offset offset = grid[y*width+x]; ++ Offset offset = grid->offset[y*width+x]; + const T* s = &src[((y+offset.iy)*width+(x+offset.ix))*N]; + for (int i = 0; i < N; i++) { + dst[(y*width+x)*N+i] = ((s[ i] * (256-offset.fx) + s[ N+i] * offset.fx) * (256-offset.fy) +@@ -188,8 +194,17 @@ static void Warp(const Offset* grid, const T* src, T* dst, + } + + void CameraIntrinsics::FreeLookupGrid() { +- if(distort_) delete distort_, distort_=0; +- if(undistort_) delete undistort_, undistort_=0; ++ if(distort_) { ++ delete distort_; ++ delete distort_->offset; ++ distort_ = NULL; ++ } ++ ++ if(undistort_) { ++ delete undistort_; ++ delete undistort_->offset; ++ undistort_ = NULL; ++ } + } + + // FIXME: C++ templates limitations makes thing complicated, but maybe there is a simpler method. +@@ -211,11 +226,50 @@ struct InvertIntrinsicsFunction { + } + }; + +-void CameraIntrinsics::Distort(const float* src, float* dst, int width, int height, int channels) { +- if(!distort_) { +- distort_ = new Offset[width*height]; +- ComputeLookupGrid(distort_,width,height); ++void CameraIntrinsics::CheckDistortLookupGrid(int width, int height) ++{ ++ if(distort_) { ++ if(distort_->width != width || distort_->height != height) { ++ delete [] distort_->offset; ++ distort_->offset = NULL; ++ } ++ } else { ++ distort_ = new Grid; ++ distort_->offset = NULL; ++ } ++ ++ if(!distort_->offset) { ++ distort_->offset = new Offset[width*height]; ++ ComputeLookupGrid(distort_,width,height); + } ++ ++ distort_->width = width; ++ distort_->height = height; ++} ++ ++void CameraIntrinsics::CheckUndistortLookupGrid(int width, int height) ++{ ++ if(undistort_) { ++ if(undistort_->width != width || undistort_->height != height) { ++ delete [] undistort_->offset; ++ undistort_->offset = NULL; ++ } ++ } else { ++ undistort_ = new Grid; ++ undistort_->offset = NULL; ++ } ++ ++ if(!undistort_->offset) { ++ undistort_->offset = new Offset[width*height]; ++ ComputeLookupGrid(undistort_,width,height); ++ } ++ ++ undistort_->width = width; ++ undistort_->height = height; ++} ++ ++void CameraIntrinsics::Distort(const float* src, float* dst, int width, int height, int channels) { ++ CheckDistortLookupGrid(width, height); + if(channels==1) Warp(distort_,src,dst,width,height); + else if(channels==2) Warp(distort_,src,dst,width,height); + else if(channels==3) Warp(distort_,src,dst,width,height); +@@ -224,10 +278,7 @@ void CameraIntrinsics::Distort(const float* src, float* dst, int width, int heig + } + + void CameraIntrinsics::Distort(const unsigned char* src, unsigned char* dst, int width, int height, int channels) { +- if(!distort_) { +- distort_ = new Offset[width*height]; +- ComputeLookupGrid(distort_,width,height); +- } ++ CheckDistortLookupGrid(width, height); + if(channels==1) Warp(distort_,src,dst,width,height); + else if(channels==2) Warp(distort_,src,dst,width,height); + else if(channels==3) Warp(distort_,src,dst,width,height); +@@ -236,10 +287,7 @@ void CameraIntrinsics::Distort(const unsigned char* src, unsigned char* dst, int + } + + void CameraIntrinsics::Undistort(const float* src, float* dst, int width, int height, int channels) { +- if(!undistort_) { +- undistort_ = new Offset[width*height]; +- ComputeLookupGrid(undistort_,width,height); +- } ++ CheckUndistortLookupGrid(width, height); + if(channels==1) Warp(undistort_,src,dst,width,height); + else if(channels==2) Warp(undistort_,src,dst,width,height); + else if(channels==3) Warp(undistort_,src,dst,width,height); +@@ -248,10 +296,7 @@ void CameraIntrinsics::Undistort(const float* src, float* dst, int width, int he + } + + void CameraIntrinsics::Undistort(const unsigned char* src, unsigned char* dst, int width, int height, int channels) { +- if(!undistort_) { +- undistort_ = new Offset[width*height]; +- ComputeLookupGrid(undistort_,width,height); +- } ++ CheckUndistortLookupGrid(width, height); + if(channels==1) Warp(undistort_,src,dst,width,height); + else if(channels==2) Warp(undistort_,src,dst,width,height); + else if(channels==3) Warp(undistort_,src,dst,width,height); +diff --git a/src/libmv/simple_pipeline/camera_intrinsics.h b/src/libmv/simple_pipeline/camera_intrinsics.h +index 29bc8a1..99141c6 100644 +--- a/src/libmv/simple_pipeline/camera_intrinsics.h ++++ b/src/libmv/simple_pipeline/camera_intrinsics.h +@@ -26,8 +26,6 @@ typedef Eigen::Matrix Mat3; + + namespace libmv { + +-struct Offset; +- + class CameraIntrinsics { + public: + CameraIntrinsics(); +@@ -123,7 +121,9 @@ class CameraIntrinsics { + int width, int height, int channels); + + private: +- template void ComputeLookupGrid(Offset* grid, int width, int height); ++ template void ComputeLookupGrid(struct Grid* grid, int width, int height); ++ void CheckUndistortLookupGrid(int width, int height); ++ void CheckDistortLookupGrid(int width, int height); + void FreeLookupGrid(); + + // The traditional intrinsics matrix from x = K[R|t]X. +@@ -140,8 +140,8 @@ class CameraIntrinsics { + // independent of image size. + double k1_, k2_, k3_, p1_, p2_; + +- Offset* distort_; +- Offset* undistort_; ++ struct Grid *distort_; ++ struct Grid *undistort_; + }; + + } // namespace libmv diff --git a/extern/libmv/patches/series b/extern/libmv/patches/series index 9e4f8c15bd5..8f785a659cf 100644 --- a/extern/libmv/patches/series +++ b/extern/libmv/patches/series @@ -8,3 +8,4 @@ function_derivative.patch high_distortion_crash_fix.patch mingw.patch msvc2010.patch +scaled_distortion.patch diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 60005b396c1..b5f061b80f4 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -567,8 +567,7 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat); #define CMP_NODE_MOVIECLIP 262 #define CMP_NODE_STABILIZE2D 263 #define CMP_NODE_TRANSFORM 264 -#define CMP_NODE_MOVIEUNDISTORT 265 -#define CMP_NODE_MOVIEDISTORT 266 +#define CMP_NODE_MOVIEDISTORTION 265 #define CMP_NODE_GLARE 301 #define CMP_NODE_TONEMAP 302 diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h index 706654dcafe..3f2b44c2fef 100644 --- a/source/blender/blenkernel/BKE_tracking.h +++ b/source/blender/blenkernel/BKE_tracking.h @@ -94,8 +94,8 @@ void BKE_tracking_stabilization_data(struct MovieTracking *tracking, int framenr struct ImBuf *BKE_tracking_stabilize(struct MovieTracking *tracking, int framenr, struct ImBuf *ibuf, float loc[2], float *scale, float *angle); void BKE_tracking_stabdata_to_mat4(int width, int height, float loc[2], float scale, float angle, float mat[4][4]); -struct ImBuf *BKE_tracking_undistort(struct MovieTracking *tracking, struct ImBuf *ibuf); -struct ImBuf *BKE_tracking_distort(struct MovieTracking *tracking, struct ImBuf *ibuf); +struct ImBuf *BKE_tracking_undistort(struct MovieTracking *tracking, struct ImBuf *ibuf, int width, int height); +struct ImBuf *BKE_tracking_distort(struct MovieTracking *tracking, struct ImBuf *ibuf, int width, int height); #define TRACK_SELECTED(track) ((((track)->flag&TRACK_HIDDEN)==0) && ((track)->flag&SELECT || (track)->pat_flag&SELECT || (track)->search_flag&SELECT)) #define TRACK_AREA_SELECTED(track, area) ((((track)->flag&TRACK_HIDDEN)==0) && ((area)==TRACK_AREA_POINT?(track)->flag&SELECT : ((area)==TRACK_AREA_PAT?(track)->pat_flag&SELECT:(track)->search_flag&SELECT))) diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index f96bae50018..94064ed5c60 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -525,20 +525,13 @@ static ImBuf *get_undistorted_cache(MovieClip *clip, MovieClipUser *user) static ImBuf *get_undistorted_ibuf(MovieClip *clip, ImBuf *ibuf) { - ImBuf *aspectibuf= ibuf, *undistibuf; - float aspy= 1.f/clip->tracking.camera.pixel_aspect; - - if(aspectibuf->y*aspy!=aspectibuf->y) { - /* XXX: not nice, but distortion coefficients were adjusted exactly for such aspect ratio */ - aspectibuf= IMB_dupImBuf(aspectibuf); - IMB_scaleImBuf(aspectibuf, aspectibuf->x, aspectibuf->y*aspy); - } + ImBuf *undistibuf; /* XXX: because of #27997 do not use float buffers to undistort, otherwise, undistorted proxy can be darker than it should */ - imb_freerectfloatImBuf(aspectibuf); + imb_freerectfloatImBuf(ibuf); - undistibuf= BKE_tracking_undistort(&clip->tracking, aspectibuf); + undistibuf= BKE_tracking_undistort(&clip->tracking, ibuf, ibuf->x, ibuf->y); if(undistibuf->userflags|= IB_RECT_INVALID) { ibuf->userflags&= ~IB_RECT_INVALID; @@ -547,9 +540,6 @@ static ImBuf *get_undistorted_ibuf(MovieClip *clip, ImBuf *ibuf) IMB_scaleImBuf(undistibuf, ibuf->x, ibuf->y); - if(aspectibuf!=ibuf) - IMB_freeImBuf(aspectibuf); - return undistibuf; } diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 52223ecd6e9..c6ea619b225 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1849,8 +1849,7 @@ static void registerCompositNodes(ListBase *ntypelist) register_node_type_cmp_lensdist(ntypelist); register_node_type_cmp_transform(ntypelist); register_node_type_cmp_stabilize2d(ntypelist); - register_node_type_cmp_moviedistort(ntypelist); - register_node_type_cmp_movieundistort(ntypelist); + register_node_type_cmp_moviedistortion(ntypelist); } static void registerShaderNodes(ListBase *ntypelist) diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 4083d43be06..2009fa84f16 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -1897,7 +1897,7 @@ void BKE_tracking_stabdata_to_mat4(int width, int height, float loc[2], float sc mul_serie_m4(mat, lmat, smat, cmat, rmat, icmat, NULL, NULL, NULL); } -ImBuf *BKE_tracking_undistort(MovieTracking *tracking, ImBuf *ibuf) +ImBuf *BKE_tracking_undistort(MovieTracking *tracking, ImBuf *ibuf, int width, int height) { ImBuf *resibuf; MovieTrackingCamera *camera= &tracking->camera; @@ -1909,11 +1909,11 @@ ImBuf *BKE_tracking_undistort(MovieTracking *tracking, ImBuf *ibuf) if(camera->intrinsics == NULL) { camera->intrinsics= libmv_CameraIntrinsicsNew(camera->focal, camera->principal[0], camera->principal[1] * aspy, - camera->k1, camera->k2, camera->k3); + camera->k1, camera->k2, camera->k3, width, height * aspy); } else { libmv_CameraIntrinsicsUpdate(camera->intrinsics, camera->focal, camera->principal[0], camera->principal[1] * aspy, - camera->k1, camera->k2, camera->k3); + camera->k1, camera->k2, camera->k3, width, height * aspy); } #endif @@ -1936,7 +1936,7 @@ ImBuf *BKE_tracking_undistort(MovieTracking *tracking, ImBuf *ibuf) return resibuf; } -ImBuf *BKE_tracking_distort(MovieTracking *tracking, ImBuf *ibuf) +ImBuf *BKE_tracking_distort(MovieTracking *tracking, ImBuf *ibuf, int width, int height) { ImBuf *resibuf; MovieTrackingCamera *camera= &tracking->camera; @@ -1948,11 +1948,11 @@ ImBuf *BKE_tracking_distort(MovieTracking *tracking, ImBuf *ibuf) if(camera->intrinsics == NULL) { camera->intrinsics= libmv_CameraIntrinsicsNew(camera->focal, camera->principal[0], camera->principal[1] * aspy, - camera->k1, camera->k2, camera->k3); + camera->k1, camera->k2, camera->k3, width, height * aspy); } else { libmv_CameraIntrinsicsUpdate(camera->intrinsics, camera->focal, camera->principal[0], camera->principal[1] * aspy, - camera->k1, camera->k2, camera->k3); + camera->k1, camera->k2, camera->k3, width, height * aspy); } #endif diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 8218aff1e74..3ff2899777f 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -1697,15 +1697,16 @@ static void node_composit_buts_transform(uiLayout *layout, bContext *UNUSED(C), uiItemR(layout, ptr, "filter_type", 0, "", 0); } -static void node_composit_buts_movieundistort(uiLayout *layout, bContext *C, PointerRNA *ptr) +static void node_composit_buts_moviedistortion(uiLayout *layout, bContext *C, PointerRNA *ptr) { + bNode *node= ptr->data; + uiTemplateID(layout, C, ptr, "clip", NULL, "CLIP_OT_open", NULL); -} + if(!node->id) + return; -static void node_composit_buts_moviedistort(uiLayout *layout, bContext *C, PointerRNA *ptr) -{ - uiTemplateID(layout, C, ptr, "clip", NULL, "CLIP_OT_open", NULL); + uiItemR(layout, ptr, "distortion_type", 0, "", 0); } /* only once called */ @@ -1867,11 +1868,8 @@ static void node_composit_set_butfunc(bNodeType *ntype) case CMP_NODE_TRANSFORM: ntype->uifunc= node_composit_buts_transform; break; - case CMP_NODE_MOVIEUNDISTORT: - ntype->uifunc= node_composit_buts_movieundistort; - break; - case CMP_NODE_MOVIEDISTORT: - ntype->uifunc= node_composit_buts_moviedistort; + case CMP_NODE_MOVIEDISTORTION: + ntype->uifunc= node_composit_buts_moviedistortion; break; default: ntype->uifunc= NULL; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 809820653cc..b164a4fcc1e 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -2447,27 +2447,26 @@ static void def_cmp_stabilize2d(StructRNA *srna) RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } -static void def_cmp_movieundistort(StructRNA *srna) +static void def_cmp_moviedistortion(StructRNA *srna) { PropertyRNA *prop; + static EnumPropertyItem distortion_type_items[] = { + {0, "UNDISTORT", 0, "Undistort", ""}, + {1, "DISTORT", 0, "Distort", ""}, + {0, NULL, 0, NULL, NULL}}; + prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "id"); RNA_def_property_struct_type(prop, "MovieClip"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Movie Clip", ""); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); -} -static void def_cmp_moviedistort(StructRNA *srna) -{ - PropertyRNA *prop; - - prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE); - RNA_def_property_pointer_sdna(prop, NULL, "id"); - RNA_def_property_struct_type(prop, "MovieClip"); - RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Movie Clip", ""); + prop = RNA_def_property(srna, "distortion_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom1"); + RNA_def_property_enum_items(prop, distortion_type_items); + RNA_def_property_ui_text(prop, "Distortion", "Distoriton to use to filter image"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); } diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h index d4b0bc66516..21c41d64e32 100644 --- a/source/blender/makesrna/intern/rna_nodetree_types.h +++ b/source/blender/makesrna/intern/rna_nodetree_types.h @@ -122,8 +122,7 @@ DefNode( CompositorNode, CMP_NODE_HUECORRECT, def_cmp_huecorrect, "HUECO DefNode( CompositorNode, CMP_NODE_MOVIECLIP, def_cmp_movieclip, "MOVIECLIP", MovieClip, "MovieClip", "" ) DefNode( CompositorNode, CMP_NODE_TRANSFORM, dev_cmd_transform, "TRANSFORM", Transform, "Transform", "" ) DefNode( CompositorNode, CMP_NODE_STABILIZE2D, def_cmp_stabilize2d, "STABILIZE2D", Stabilize, "Stabelize 2D", "" ) -DefNode( CompositorNode, CMP_NODE_MOVIEDISTORT, def_cmp_moviedistort, "MOVIEDISTORT", MovieDistort, "Movie Distort", "" ) -DefNode( CompositorNode, CMP_NODE_MOVIEUNDISTORT, def_cmp_movieundistort, "MOVIEUNDISTORT", MovieUndistort, "Movie Undistort", "" ) +DefNode( CompositorNode, CMP_NODE_MOVIEDISTORTION,def_cmp_moviedistortion,"MOVIEDISTORTION",MovieDistortion, "Movie Distortion", "" ) DefNode( TextureNode, TEX_NODE_OUTPUT, def_tex_output, "OUTPUT", Output, "Output", "" ) DefNode( TextureNode, TEX_NODE_CHECKER, 0, "CHECKER", Checker, "Checker", "" ) diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index 199a43131d7..69e7f9cac6b 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -81,8 +81,7 @@ set(SRC composite/nodes/node_composite_math.c composite/nodes/node_composite_mixrgb.c composite/nodes/node_composite_movieclip.c - composite/nodes/node_composite_moviedistort.c - composite/nodes/node_composite_movieundistort.c + composite/nodes/node_composite_moviedistortion.c composite/nodes/node_composite_normal.c composite/nodes/node_composite_normalize.c composite/nodes/node_composite_outputFile.c diff --git a/source/blender/nodes/NOD_composite.h b/source/blender/nodes/NOD_composite.h index fce9a18c0ad..4eec2fa5488 100644 --- a/source/blender/nodes/NOD_composite.h +++ b/source/blender/nodes/NOD_composite.h @@ -118,8 +118,7 @@ void register_node_type_cmp_displace(ListBase *lb); void register_node_type_cmp_mapuv(ListBase *lb); void register_node_type_cmp_transform(ListBase *lb); void register_node_type_cmp_stabilize2d(ListBase *lb); -void register_node_type_cmp_moviedistort(ListBase *lb); -void register_node_type_cmp_movieundistort(ListBase *lb); +void register_node_type_cmp_moviedistortion(ListBase *lb); void register_node_type_cmp_glare(ListBase *lb); void register_node_type_cmp_tonemap(ListBase *lb); diff --git a/source/blender/nodes/composite/nodes/node_composite_movieclip.c b/source/blender/nodes/composite/nodes/node_composite_movieclip.c index d3fdb079538..2f67e0daae3 100644 --- a/source/blender/nodes/composite/nodes/node_composite_movieclip.c +++ b/source/blender/nodes/composite/nodes/node_composite_movieclip.c @@ -158,8 +158,13 @@ static void node_composit_exec_movieclip(void *data, bNode *node, bNodeStack **U static void init(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) { MovieClipUser *user= MEM_callocN(sizeof(MovieClipUser), "node movie clip user"); + node->storage= user; user->framenr= 1; + + if(G.main->movieclip.first == G.main->movieclip.last) { + node->id= G.main->movieclip.first; + } } void register_node_type_cmp_movieclip(ListBase *lb) diff --git a/source/blender/nodes/composite/nodes/node_composite_moviedistort.c b/source/blender/nodes/composite/nodes/node_composite_moviedistort.c deleted file mode 100644 index a56a27f5844..00000000000 --- a/source/blender/nodes/composite/nodes/node_composite_moviedistort.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2006 Blender Foundation. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Blender Foundation, - * Sergey Sharybin - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file blender/nodes/composite/nodes/node_composite_moviedistort.c - * \ingroup cmpnodes - */ - - -#include "node_composite_util.h" - -/* **************** Translate ******************** */ - -static bNodeSocketTemplate cmp_node_moviedistort_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { -1, 0, "" } -}; - -static bNodeSocketTemplate cmp_node_moviedistort_out[]= { - { SOCK_RGBA, 0, "Image"}, - { -1, 0, "" } -}; - -static void node_composit_exec_moviedistort(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - if(in[0]->data && node->id) { - MovieClip *clip= (MovieClip *)node->id; - CompBuf *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 0); - ImBuf *ibuf; - - ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0); - - if(ibuf) { - ImBuf *obuf; - MovieClipUser *user= (MovieClipUser *)node->storage; - float aspy= 1.f/clip->tracking.camera.pixel_aspect; - int scaled= 0, width, height; - - ibuf->rect_float= cbuf->rect; - - BKE_movieclip_acquire_size(clip, user, &width, &height); - height*= aspy; - - if(ibuf->x!=width || ibuf->y!=height) { - /* TODO: not sure this is really needed, but distortion coefficients are - calculated using camera resolution, so if image with other resolution - is passed to distortion node, it'll be distorted correct (but quality can hurt) - This is also needed to deal when camera pixel aspect isn't 1. Problems in this case - are caused because of how aspect x/y are calculating. Currently. projeciton - matrices and reconstruction stuff are supposing that aspect x is always 1 and - aspect y is less than 1 (if x resolution is larger than y resolution) */ - - IMB_scaleImBuf(ibuf, width, height); - scaled= 1; - } - - obuf= BKE_tracking_distort(&clip->tracking, ibuf); - - if(scaled) - IMB_scaleImBuf(obuf, cbuf->x, cbuf->y); - - stackbuf->rect= obuf->rect_float; - stackbuf->malloc= 1; - - obuf->mall&= ~IB_rectfloat; - obuf->rect_float= NULL; - - IMB_freeImBuf(ibuf); - IMB_freeImBuf(obuf); - } - - /* pass on output and free */ - out[0]->data= stackbuf; - - if(cbuf!=in[0]->data) - free_compbuf(cbuf); - } -} - -void register_node_type_cmp_moviedistort(ListBase *lb) -{ - static bNodeType ntype; - - node_type_base(&ntype, CMP_NODE_MOVIEDISTORT, "Movie Distort", NODE_CLASS_DISTORT, NODE_OPTIONS); - node_type_socket_templates(&ntype, cmp_node_moviedistort_in, cmp_node_moviedistort_out); - node_type_size(&ntype, 140, 100, 320); - node_type_exec(&ntype, node_composit_exec_moviedistort); - - nodeRegisterType(lb, &ntype); -} diff --git a/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c b/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c new file mode 100644 index 00000000000..9e860543b9a --- /dev/null +++ b/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c @@ -0,0 +1,126 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2006 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Blender Foundation, + * Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/composite/nodes/node_composite_moviedistortion.c + * \ingroup cmpnodes + */ + + +#include "node_composite_util.h" + +/* **************** Translate ******************** */ + +static bNodeSocketTemplate cmp_node_moviedistortion_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeSocketTemplate cmp_node_moviedistortion_out[]= { + { SOCK_RGBA, 0, "Image"}, + { -1, 0, "" } +}; + +static void exec(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) +{ + if(in[0]->data) { + if(node->id) { + MovieClip *clip= (MovieClip *)node->id; + CompBuf *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); + CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 0); + ImBuf *ibuf; + + ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0); + + if(ibuf) { + ImBuf *obuf; + MovieClipUser *user= (MovieClipUser *)node->storage; + int width, height; + + ibuf->rect_float= cbuf->rect; + + BKE_movieclip_acquire_size(clip, user, &width, &height); + + if(node->custom1==0) + obuf= BKE_tracking_undistort(&clip->tracking, ibuf, width, height); + else + obuf= BKE_tracking_distort(&clip->tracking, ibuf, width, height); + + stackbuf->rect= obuf->rect_float; + stackbuf->malloc= 1; + + obuf->mall&= ~IB_rectfloat; + obuf->rect_float= NULL; + + IMB_freeImBuf(ibuf); + IMB_freeImBuf(obuf); + } + + /* pass on output and free */ + out[0]->data= stackbuf; + + if(cbuf!=in[0]->data) + free_compbuf(cbuf); + } else { + CompBuf *cbuf= in[0]->data; + CompBuf *stackbuf= pass_on_compbuf(cbuf); + + out[0]->data= stackbuf; + } + } +} + +static void init(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) +{ + if(G.main->movieclip.first == G.main->movieclip.last) { + node->id= G.main->movieclip.first; + } +} + +static const char *label(bNode *node) +{ + if(node->custom1==0) + return "Undistortion"; + else + return "Distortion"; +} + +void register_node_type_cmp_moviedistortion(ListBase *lb) +{ + static bNodeType ntype; + + node_type_base(&ntype, CMP_NODE_MOVIEDISTORTION, "Movie Distortion", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_moviedistortion_in, cmp_node_moviedistortion_out); + node_type_size(&ntype, 140, 100, 320); + node_type_init(&ntype, init); + node_type_label(&ntype, label); + node_type_exec(&ntype, exec); + + nodeRegisterType(lb, &ntype); +} diff --git a/source/blender/nodes/composite/nodes/node_composite_movieundistort.c b/source/blender/nodes/composite/nodes/node_composite_movieundistort.c deleted file mode 100644 index 58902334c59..00000000000 --- a/source/blender/nodes/composite/nodes/node_composite_movieundistort.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2006 Blender Foundation. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): Blender Foundation, - * Sergey Sharybin - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file blender/nodes/composite/nodes/node_composite_movieundistort.c - * \ingroup cmpnodes - */ - - -#include "node_composite_util.h" - -/* **************** Translate ******************** */ - -static bNodeSocketTemplate cmp_node_movieundistort_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { -1, 0, "" } -}; - -static bNodeSocketTemplate cmp_node_movieundistort_out[]= { - { SOCK_RGBA, 0, "Image"}, - { -1, 0, "" } -}; - -static void node_composit_exec_movieundistort(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) -{ - if(in[0]->data && node->id) { - MovieClip *clip= (MovieClip *)node->id; - CompBuf *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA); - CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 0); - ImBuf *ibuf; - - ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0); - - if(ibuf) { - ImBuf *obuf; - MovieClipUser *user= (MovieClipUser *)node->storage; - float aspy= 1.f/clip->tracking.camera.pixel_aspect; - int scaled= 0, width, height; - - ibuf->rect_float= cbuf->rect; - - BKE_movieclip_acquire_size(clip, user, &width, &height); - height*= aspy; - - if(ibuf->x!=width || ibuf->y!=height) { - /* TODO: not sure this is really needed, but distortion coefficients are - calculated using camera resolution, so if image with other resolution - is passed to undistortion node, it'll be undistorted correct (but quality can hurt) - This is also needed to deal when camera pixel aspect isn't 1. Problems in this case - are caused because of how aspect x/y are calculating. Currently. projeciton - matrices and reconstruction stuff are supposing that aspect x is always 1 and - aspect y is less than 1 (if x resolution is larger than y resolution) */ - - IMB_scaleImBuf(ibuf, width, height); - scaled= 1; - } - - obuf= BKE_tracking_undistort(&clip->tracking, ibuf); - - if(scaled) - IMB_scaleImBuf(obuf, cbuf->x, cbuf->y); - - stackbuf->rect= obuf->rect_float; - stackbuf->malloc= 1; - - obuf->mall&= ~IB_rectfloat; - obuf->rect_float= NULL; - - IMB_freeImBuf(ibuf); - IMB_freeImBuf(obuf); - } - - /* pass on output and free */ - out[0]->data= stackbuf; - - if(cbuf!=in[0]->data) - free_compbuf(cbuf); - } -} - -void register_node_type_cmp_movieundistort(ListBase *lb) -{ - static bNodeType ntype; - - node_type_base(&ntype, CMP_NODE_MOVIEUNDISTORT, "Movie Undistort", NODE_CLASS_DISTORT, NODE_OPTIONS); - node_type_socket_templates(&ntype, cmp_node_movieundistort_in, cmp_node_movieundistort_out); - node_type_size(&ntype, 140, 100, 320); - node_type_exec(&ntype, node_composit_exec_movieundistort); - - nodeRegisterType(lb, &ntype); -}