X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=deconvolution_sharpen_effect.cpp;h=37a55e922f8d643f3c0398efe611de1b59dc5779;hp=260266403852a2beb22232e29924d4c25a873b2d;hb=eff011224abc5dc81f801f3ea44572287a55bcac;hpb=37f56fcbe571b2322243f6de59494bf9e0cbb37a diff --git a/deconvolution_sharpen_effect.cpp b/deconvolution_sharpen_effect.cpp index 2602664..37a55e9 100644 --- a/deconvolution_sharpen_effect.cpp +++ b/deconvolution_sharpen_effect.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include #include @@ -13,9 +13,13 @@ #include #include "deconvolution_sharpen_effect.h" +#include "effect_util.h" #include "util.h" using namespace Eigen; +using namespace std; + +namespace movit { DeconvolutionSharpenEffect::DeconvolutionSharpenEffect() : R(5), @@ -27,7 +31,8 @@ DeconvolutionSharpenEffect::DeconvolutionSharpenEffect() last_circle_radius(-1.0f), last_gaussian_radius(-1.0f), last_correlation(-1.0f), - last_noise(-1.0f) + last_noise(-1.0f), + uniform_samples(nullptr) { register_int("matrix_size", &R); register_float("circle_radius", &circle_radius); @@ -36,7 +41,12 @@ DeconvolutionSharpenEffect::DeconvolutionSharpenEffect() register_float("noise", &noise); } -std::string DeconvolutionSharpenEffect::output_fragment_shader() +DeconvolutionSharpenEffect::~DeconvolutionSharpenEffect() +{ + delete[] uniform_samples; +} + +string DeconvolutionSharpenEffect::output_fragment_shader() { char buf[256]; sprintf(buf, "#define R %u\n", R); @@ -44,6 +54,9 @@ std::string DeconvolutionSharpenEffect::output_fragment_shader() assert(R >= 1); assert(R <= 25); // Same limit as Refocus. + uniform_samples = new float[4 * (R + 1) * (R + 1)]; + register_uniform_vec4_array("samples", uniform_samples, (R + 1) * (R + 1)); + last_R = R; return buf + read_file("deconvolution_sharpen_effect.frag"); } @@ -169,10 +182,10 @@ MatrixXf convolve(const MatrixXf &a, const MatrixXf &b) int xa_max = xr; // Now fit to the first demand. - ya_min = std::max(ya_min, 0); - ya_max = std::min(ya_max, a.rows() - 1); - xa_min = std::max(xa_min, 0); - xa_max = std::min(xa_max, a.cols() - 1); + ya_min = max(ya_min, 0); + ya_max = min(ya_max, a.rows() - 1); + xa_min = max(xa_min, 0); + xa_max = min(xa_max, a.cols() - 1); assert(ya_max >= ya_min); assert(xa_max >= xa_min); @@ -219,10 +232,10 @@ MatrixXf central_convolve(const MatrixXf &a, const MatrixXf &b) int xa_max = xr; // Now fit to the first demand. - ya_min = std::max(ya_min, 0); - ya_max = std::min(ya_max, a.rows() - 1); - xa_min = std::max(xa_min, 0); - xa_max = std::min(xa_max, a.cols() - 1); + ya_min = max(ya_min, 0); + ya_max = min(ya_max, a.rows() - 1); + xa_min = max(xa_min, 0); + xa_max = min(xa_max, a.cols() - 1); assert(ya_max >= ya_min); assert(xa_max >= xa_min); @@ -239,16 +252,6 @@ MatrixXf central_convolve(const MatrixXf &a, const MatrixXf &b) return result; } -void print_matrix(const MatrixXf &m) -{ - for (int y = 0; y < m.rows(); ++y) { - for (int x = 0; x < m.cols(); ++x) { - printf("%7.4f ", m(x, y)); - } - printf("\n"); - } -} - } // namespace void DeconvolutionSharpenEffect::update_deconvolution_kernel() @@ -309,7 +312,7 @@ void DeconvolutionSharpenEffect::update_deconvolution_kernel() MatrixXf r_uu(8 * R + 1, 8 * R + 1); for (int y = -4 * R; y <= 4 * R; ++y) { for (int x = -4 * R; x <= 4 * R; ++x) { - r_uu(x + 4 * R, y + 4 * R) = pow(correlation, hypot(x, y)); + r_uu(x + 4 * R, y + 4 * R) = pow(double(correlation), hypot(x, y)); } } @@ -426,7 +429,7 @@ void DeconvolutionSharpenEffect::update_deconvolution_kernel() last_noise = noise; } -void DeconvolutionSharpenEffect::set_gl_state(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num) +void DeconvolutionSharpenEffect::set_gl_state(GLuint glsl_program_num, const string &prefix, unsigned *sampler_num) { Effect::set_gl_state(glsl_program_num, prefix, sampler_num); @@ -439,16 +442,15 @@ void DeconvolutionSharpenEffect::set_gl_state(GLuint glsl_program_num, const std update_deconvolution_kernel(); } // Now encode it as uniforms, and pass it on to the shader. - float samples[4 * (R + 1) * (R + 1)]; for (int y = 0; y <= R; ++y) { for (int x = 0; x <= R; ++x) { int i = y * (R + 1) + x; - samples[i * 4 + 0] = x / float(width); - samples[i * 4 + 1] = y / float(height); - samples[i * 4 + 2] = g(y, x); - samples[i * 4 + 3] = 0.0f; + uniform_samples[i * 4 + 0] = x / float(width); + uniform_samples[i * 4 + 1] = y / float(height); + uniform_samples[i * 4 + 2] = g(y, x); + uniform_samples[i * 4 + 3] = 0.0f; } } - - set_uniform_vec4_array(glsl_program_num, prefix, "samples", samples, (R + 1) * (R + 1)); } + +} // namespace movit