Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2016-01-24 22:25:38 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-01-24 22:25:38 +0300
commit81a1b002a094cd88d584e956e48d562fbad31592 (patch)
tree1323539596ef40b001f471b05f2173102dacede1 /source/blender/compositor
parent9797a135e36e6e5541da1254490eba7e534ccfe2 (diff)
Fix T47210: Compostiting, Bad AA using distort + undistort nodes
Compositor tried to be too much smart and avoid unneeded re-calculations of the distortion model, but the way it was implemented is by falling back to the nearest interpolation first. We can't really cheat here, better to just look into faster models estimation.
Diffstat (limited to 'source/blender/compositor')
-rw-r--r--source/blender/compositor/operations/COM_MovieDistortionOperation.h81
1 files changed, 30 insertions, 51 deletions
diff --git a/source/blender/compositor/operations/COM_MovieDistortionOperation.h b/source/blender/compositor/operations/COM_MovieDistortionOperation.h
index 85f075ab65a..38b1dbfa856 100644
--- a/source/blender/compositor/operations/COM_MovieDistortionOperation.h
+++ b/source/blender/compositor/operations/COM_MovieDistortionOperation.h
@@ -47,11 +47,9 @@ private:
int m_calibration_width;
int m_calibration_height;
bool m_inverted;
- float *m_buffer;
- int *m_bufferCalculated;
double timeLastUsage;
int m_margin[2];
-
+
public:
DistortionCache(MovieClip *movieclip,
int width, int height,
@@ -73,28 +71,14 @@ public:
this->m_calibration_width = calibration_width;
this->m_calibration_height = calibration_height;
this->m_inverted = inverted;
- this->m_bufferCalculated = (int *)MEM_callocN(sizeof(int) * this->m_width * this->m_height, __func__);
- this->m_buffer = (float *)MEM_mallocN(sizeof(float) * this->m_width * this->m_height * 2, __func__);
copy_v2_v2_int(this->m_margin, margin);
this->updateLastUsage();
}
-
- ~DistortionCache() {
- if (this->m_buffer) {
- MEM_freeN(this->m_buffer);
- this->m_buffer = NULL;
- }
-
- if (this->m_bufferCalculated) {
- MEM_freeN(this->m_bufferCalculated);
- this->m_bufferCalculated = NULL;
- }
- }
-
+
void updateLastUsage() {
this->timeLastUsage = PIL_check_seconds_timer();
}
-
+
inline double getTimeLastUsage() {
return this->timeLastUsage;
}
@@ -119,43 +103,38 @@ public:
this->m_calibration_width == calibration_width &&
this->m_calibration_height == claibration_height;
}
-
- void getUV(MovieTracking *trackingData, int x, int y, float *u, float *v)
+
+ void getUV(MovieTracking *trackingData,
+ float x,
+ float y,
+ float *r_u,
+ float *r_v)
{
if (x < 0 || x >= this->m_width || y < 0 || y >= this->m_height) {
- *u = x;
- *v = y;
+ *r_u = x;
+ *r_v = y;
}
else {
- int offset = y * this->m_width + x;
- int offset2 = offset * 2;
-
- if (!this->m_bufferCalculated[offset]) {
- //float overscan = 0.0f;
- const float w = (float)this->m_width /* / (1 + overscan) */;
- const float h = (float)this->m_height /* / (1 + overscan) */;
- const float aspx = w / (float)this->m_calibration_width;
- const float aspy = h / (float)this->m_calibration_height;
- float in[2];
- float out[2];
-
- in[0] = (x /* - 0.5 * overscan * w */) / aspx;
- in[1] = (y /* - 0.5 * overscan * h */) / aspy / this->m_pixel_aspect;
-
- if (this->m_inverted) {
- BKE_tracking_undistort_v2(trackingData, in, out);
- }
- else {
- BKE_tracking_distort_v2(trackingData, in, out);
- }
-
- this->m_buffer[offset2] = out[0] * aspx /* + 0.5 * overscan * w */;
- this->m_buffer[offset2 + 1] = (out[1] * aspy /* + 0.5 * overscan * h */) * this->m_pixel_aspect;
-
- this->m_bufferCalculated[offset] = 1;
+ /* float overscan = 0.0f; */
+ const float w = (float)this->m_width /* / (1 + overscan) */;
+ const float h = (float)this->m_height /* / (1 + overscan) */;
+ const float aspx = w / (float)this->m_calibration_width;
+ const float aspy = h / (float)this->m_calibration_height;
+ float in[2];
+ float out[2];
+
+ in[0] = (x /* - 0.5 * overscan * w */) / aspx;
+ in[1] = (y /* - 0.5 * overscan * h */) / aspy / this->m_pixel_aspect;
+
+ if (this->m_inverted) {
+ BKE_tracking_undistort_v2(trackingData, in, out);
+ }
+ else {
+ BKE_tracking_distort_v2(trackingData, in, out);
}
- *u = this->m_buffer[offset2];
- *v = this->m_buffer[offset2 + 1];
+
+ *r_u = out[0] * aspx /* + 0.5 * overscan * w */;
+ *r_v = (out[1] * aspy /* + 0.5 * overscan * h */) * this->m_pixel_aspect;
}
}