This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h
Lukas Tönne 9c883a1eca Fix T38011 and cleanup of Lens Distortion node code.
The area-of-interest calculation for that node didn't work reliably.
It tries to estimate the distorted rectangular area based on min/max
distortion and dispersion values, but this fails in some cases and
leaves uninitialized buffer chunks. So now simply use the full input
rect as the area, even though it may not be as efficient - at least it
works ...

Also cleaned up the code somewhat to make it understandable, using
separate functions for common stuff instead of cryptic walls of math.
2014-01-22 14:37:40 +01:00

89 lines
2.5 KiB
C++

/*
* Copyright 2011, Blender Foundation.
*
* 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.
*
* Contributor:
* Jeroen Bakker
* Monique Dewanchand
*/
#ifndef _COM_ScreenLensDistortionOperation_h
#define _COM_ScreenLensDistortionOperation_h
#include "COM_NodeOperation.h"
#include "DNA_node_types.h"
class ScreenLensDistortionOperation : public NodeOperation {
private:
/**
* Cached reference to the inputProgram
*/
SocketReader *m_inputProgram;
bool m_fit;
bool m_jitter;
float m_dispersion;
float m_distortion;
bool m_dispersion_const;
bool m_distortion_const;
bool m_variables_ready;
float m_k[3];
float m_k4[3];
float m_dk4[3];
float m_maxk;
float m_sc, m_cx, m_cy;
public:
ScreenLensDistortionOperation();
/**
* the inner loop of this program
*/
void executePixel(float output[4], int x, int y, void *data);
/**
* Initialize the execution
*/
void initExecution();
void *initializeTileData(rcti *rect);
/**
* Deinitialize the execution
*/
void deinitExecution();
void setFit(bool fit) { m_fit = fit; }
void setJitter(bool jitter) { m_jitter = jitter; }
/** Set constant distortion value */
void setDistortion(float distortion);
/** Set constant dispersion value */
void setDispersion(float dispersion);
bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
private:
void determineUV(float result[6], float x, float y) const;
void updateVariables(float distortion, float dispersion);
void get_uv(const float xy[2], float uv[2]) const;
void distort_uv(const float uv[2], float t, float xy[2]) const;
bool get_delta(float r_sq, float k4, const float uv[2], float delta[2]) const;
void accumulate(MemoryBuffer *buffer, int a, int b,
float r_sq, const float uv[2], const float delta[3][2],
float sum[4], int count[3]) const;
};
#endif