Tomato: skip cache for Movieclip input node only when rendering
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 3 Jul 2012 16:23:15 +0000 (16:23 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 3 Jul 2012 16:23:15 +0000 (16:23 +0000)
source/blender/compositor/nodes/COM_MovieClipNode.cpp
source/blender/compositor/operations/COM_MovieClipOperation.cpp
source/blender/compositor/operations/COM_MovieClipOperation.h

index 89bd0e8..a250841 100644 (file)
@@ -81,6 +81,7 @@ void MovieClipNode::convertToOperations(ExecutionSystem *graph, CompositorContex
        operation->setMovieClip(movieClip);
        operation->setMovieClipUser(movieClipUser);
        operation->setFramenumber(context->getFramenumber());
+       operation->setCacheFrame(!context->isRendering());
        graph->addOperation(operation);
 
        MovieTrackingStabilization *stab = &movieClip->tracking.stabilization;
index b32c279..a5cc719 100644 (file)
@@ -48,9 +48,16 @@ void MovieClipOperation::initExecution()
        if (this->m_movieClip) {
                BKE_movieclip_user_set_frame(this->m_movieClipUser, this->m_framenumber);
                ImBuf *ibuf;
-               int flag = this->m_movieClip->flag & MCLIP_TIMECODE_FLAGS;
 
-               ibuf = BKE_movieclip_get_ibuf_flag(this->m_movieClip, this->m_movieClipUser, flag, MOVIECLIP_CACHE_SKIP);
+               if (this->m_cacheFrame) {
+                       ibuf = BKE_movieclip_get_ibuf(this->m_movieClip, this->m_movieClipUser);
+               }
+               else {
+                       int flag = this->m_movieClip->flag & MCLIP_TIMECODE_FLAGS;
+
+                       ibuf = BKE_movieclip_get_ibuf_flag(this->m_movieClip, this->m_movieClipUser, flag, MOVIECLIP_CACHE_SKIP);
+               }
+
                if (ibuf) {
                        this->m_movieClipBuffer = ibuf;
                        if (ibuf->rect_float == NULL || ibuf->userflags & IB_RECT_INVALID) {
index 2e82400..50d7921 100644 (file)
@@ -43,6 +43,7 @@ protected:
        int m_movieClipheight;
        int m_movieClipwidth;
        int m_framenumber;
+       bool m_cacheFrame;
        
        /**
         * Determine the output resolution. The resolution is retrieved from the Renderer
@@ -56,6 +57,7 @@ public:
        void deinitExecution();
        void setMovieClip(MovieClip *image) { this->m_movieClip = image; }
        void setMovieClipUser(MovieClipUser *imageuser) { this->m_movieClipUser = imageuser; }
+       void setCacheFrame(bool value) { this->m_cacheFrame = value; }
 
        void setFramenumber(int framenumber) { this->m_framenumber = framenumber; }
        void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer * inputBuffers[]);