compositor - EWA filter was blurring too much by default, this caused the displace...
authorCampbell Barton <ideasman42@gmail.com>
Thu, 16 Aug 2012 10:13:04 +0000 (10:13 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 16 Aug 2012 10:13:04 +0000 (10:13 +0000)
Added this option back and use for displace and UV composite nodes.

source/blender/compositor/intern/COM_MemoryBuffer.cpp
source/blender/compositor/intern/COM_MemoryBuffer.h
source/blender/compositor/intern/COM_SocketReader.h
source/blender/compositor/operations/COM_DisplaceOperation.cpp
source/blender/compositor/operations/COM_MapUVOperation.cpp
source/blender/compositor/operations/COM_ReadBufferOperation.cpp
source/blender/compositor/operations/COM_ReadBufferOperation.h

index 3b8fbd6d708fb2b39a78bdf817580d4b0ba39969..d227f9cc4bb02302502c8d7ad7afcb2ecd42b1b5 100644 (file)
@@ -259,7 +259,10 @@ float clipuv(float x, float limit)
        return x;
 }
 
-void MemoryBuffer::readEWA(float result[4], float fx, float fy, float dx, float dy)
+/**
+ * \note \a sampler at the moment is either 'COM_PS_NEAREST' or not, other values won't matter.
+ */
+void MemoryBuffer::readEWA(float result[4], float fx, float fy, float dx, float dy, PixelSampler sampler)
 {
        const int width = this->getWidth(), height = this->getHeight();
        
@@ -280,7 +283,7 @@ void MemoryBuffer::readEWA(float result[4], float fx, float fy, float dx, float
        // Use a different radius based on interpolation switch, just enough to anti-alias when interpolation is off,
        // and slightly larger to make result a bit smoother than bilinear interpolation when interpolation is on
        // (minimum values: const float rmin = intpol ? 1.f : 0.5f;)
-       const float rmin = 1.5625f / ff2;
+       const float rmin = ((sampler != COM_PS_NEAREST) ? 1.5625f : 0.765625f) / ff2;
        imp2radangle(A, B, C, F, &a, &b, &th, &ecc);
        if ((b2 = b * b) < rmin) {
                if ((a2 = a * a) < rmin) {
index 5d0d9c97450368432fecc512a3edd351bc4f9387..d176298578f7e96c5cad428ffcbace21dacce931 100644 (file)
@@ -202,7 +202,7 @@ public:
                
 
 
-       void readEWA(float result[4], float fx, float fy, float dx, float dy);
+       void readEWA(float result[4], float fx, float fy, float dx, float dy, PixelSampler sampler);
        
        /**
         * @brief is this MemoryBuffer a temporarily buffer (based on an area, not on a chunk)
index 279ca8ebdb83b6361fe9f78438a0f802d1513172..01e1403b021cbff2eb7a76f26cb900ddf04ed863 100644 (file)
@@ -88,7 +88,7 @@ protected:
         * @param dy
         * @param inputBuffers chunks that can be read by their ReadBufferOperation.
         */
-       virtual void executePixel(float output[4], float x, float y, float dx, float dy) {}
+       virtual void executePixel(float output[4], float x, float y, float dx, float dy, PixelSampler sampler) {}
 
 public:
        inline void read(float *result, float x, float y, PixelSampler sampler) {
@@ -97,8 +97,8 @@ public:
        inline void read(float *result, int x, int y, void *chunkData) {
                executePixel(result, x, y, chunkData);
        }
-       inline void read(float *result, float x, float y, float dx, float dy) {
-               executePixel(result, x, y, dx, dy);
+       inline void read(float *result, float x, float y, float dx, float dy, PixelSampler sampler) {
+               executePixel(result, x, y, dx, dy, sampler);
        }
 
        virtual void *initializeTileData(rcti *rect) { return 0; }
index 39f0ac7874b521eaa29f3f14ab4823fa59ca27f5..31608c88274e1ad29c1bae3161a84d12a9d0d0bb 100644 (file)
@@ -95,8 +95,8 @@ void DisplaceOperation::executePixel(float output[4], int x, int y, void *data)
        dxt = signf(dxt) * maxf(fabsf(dxt), DISPLACE_EPSILON) / this->getWidth();
        dyt = signf(dyt) * maxf(fabsf(dyt), DISPLACE_EPSILON) / this->getHeight();
 
-       /* EWA filtering */
-       this->m_inputColorProgram->read(output, u, v, dxt, dyt);
+       /* EWA filtering (without nearest it gets blurry with NO distortion) */
+       this->m_inputColorProgram->read(output, u, v, dxt, dyt, COM_PS_NEAREST);
 }
 
 void DisplaceOperation::deinitExecution()
index 1a441b0ac9a99e0bc5e3eb4b73770608079c362d..fe6ebcebf97e9c1ca43e955219b423ea94484a65 100644 (file)
@@ -107,7 +107,7 @@ void MapUVOperation::executePixel(float output[4], float x, float y, PixelSample
        u = inputUV[0] * this->m_inputColorProgram->getWidth();
        v = inputUV[1] * this->m_inputColorProgram->getHeight();
 
-       this->m_inputColorProgram->read(output, u, v, dx, dy);
+       this->m_inputColorProgram->read(output, u, v, dx, dy, COM_PS_NEAREST);
 
        /* "premul" */
        if (alpha < 1.0f) {
index a2385f79c045b456732378798263971392f16081..03d41edda647c5fe2d8ed0ef3bba156cfe8a1b8f 100644 (file)
@@ -59,9 +59,9 @@ void ReadBufferOperation::executePixel(float output[4], float x, float y, PixelS
        }
 }
 
-void ReadBufferOperation::executePixel(float output[4], float x, float y, float dx, float dy)
+void ReadBufferOperation::executePixel(float output[4], float x, float y, float dx, float dy, PixelSampler sampler)
 {
-       m_buffer->readEWA(output, x, y, dx, dy);
+       m_buffer->readEWA(output, x, y, dx, dy, sampler);
 }
 
 bool ReadBufferOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)
index 7958a4aee6bf9b6862964c91c8b99e1d209fe8f4..7e3ac147ee358ce724ac2fcbf09df7ce27f438d2 100644 (file)
@@ -40,7 +40,7 @@ public:
        
        void *initializeTileData(rcti *rect);
        void executePixel(float output[4], float x, float y, PixelSampler sampler);
-       void executePixel(float output[4], float x, float y, float dx, float dy);
+       void executePixel(float output[4], float x, float y, float dx, float dy, PixelSampler sampler);
        const bool isReadBufferOperation() const { return true; }
        void setOffset(unsigned int offset) { this->m_offset = offset; }
        unsigned int getOffset() { return this->m_offset; }