diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-10-27 17:59:17 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-10-27 18:01:10 +0300 |
commit | ea67f55b87e362e4e46097d88236639e6c2ea472 (patch) | |
tree | bf173a2d962f46c96c8d723f1becb441b0258221 /source/blender/compositor | |
parent | b2f57190d9f2cc3ece678ef788b42eefb5631a2e (diff) |
Compositor: Add Invert option to the movie clip stabilization node
This appears to be really common workflow when you stabilize shot to make compo
easier (roto, some effects and so) and then re-introduce the motion back.
Surely it's doable with some magic nodes and manual network for transforming
but such workflow is too common in VFX to resist adding one small option in
single node for this.
Diffstat (limited to 'source/blender/compositor')
3 files changed, 26 insertions, 8 deletions
diff --git a/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp b/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp index d1babcc8103..f25c7b3fc2d 100644 --- a/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp +++ b/source/blender/compositor/nodes/COM_Stabilize2dNode.cpp @@ -40,11 +40,13 @@ Stabilize2dNode::Stabilize2dNode(bNode *editorNode) : Node(editorNode) void Stabilize2dNode::convertToOperations(NodeConverter &converter, const CompositorContext &context) const { + bNode *editorNode = this->getbNode(); NodeInput *imageInput = this->getInputSocket(0); - MovieClip *clip = (MovieClip *)getbNode()->id; + MovieClip *clip = (MovieClip *)editorNode->id; + bool invert = (editorNode->custom2 & CMP_NODEFLAG_STABILIZE_INVERSE) != 0; ScaleOperation *scaleOperation = new ScaleOperation(); - scaleOperation->setSampler((PixelSampler)this->getbNode()->custom1); + scaleOperation->setSampler((PixelSampler)editorNode->custom1); RotateOperation *rotateOperation = new RotateOperation(); rotateOperation->setDoDegree2RadConversion(false); TranslateOperation *translateOperation = new TranslateOperation(); @@ -53,24 +55,28 @@ void Stabilize2dNode::convertToOperations(NodeConverter &converter, const Compos MovieClipAttributeOperation *xAttribute = new MovieClipAttributeOperation(); MovieClipAttributeOperation *yAttribute = new MovieClipAttributeOperation(); SetSamplerOperation *psoperation = new SetSamplerOperation(); - psoperation->setSampler((PixelSampler)this->getbNode()->custom1); - + psoperation->setSampler((PixelSampler)editorNode->custom1); + scaleAttribute->setAttribute(MCA_SCALE); scaleAttribute->setFramenumber(context.getFramenumber()); scaleAttribute->setMovieClip(clip); - + scaleAttribute->setInvert(invert); + angleAttribute->setAttribute(MCA_ANGLE); angleAttribute->setFramenumber(context.getFramenumber()); angleAttribute->setMovieClip(clip); - + angleAttribute->setInvert(invert); + xAttribute->setAttribute(MCA_X); xAttribute->setFramenumber(context.getFramenumber()); xAttribute->setMovieClip(clip); - + xAttribute->setInvert(invert); + yAttribute->setAttribute(MCA_Y); yAttribute->setFramenumber(context.getFramenumber()); yAttribute->setMovieClip(clip); - + yAttribute->setInvert(invert); + converter.addOperation(scaleAttribute); converter.addOperation(angleAttribute); converter.addOperation(xAttribute); diff --git a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp index 040a0315d69..5ddf15f7684 100644 --- a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp +++ b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.cpp @@ -31,12 +31,14 @@ MovieClipAttributeOperation::MovieClipAttributeOperation() : NodeOperation() this->m_valueSet = false; this->m_framenumber = 0; this->m_attribute = MCA_X; + this->m_invert = false; } void MovieClipAttributeOperation::executePixelSampled(float output[4], float /*x*/, float /*y*/, PixelSampler /*sampler*/) { + /* TODO(sergey): This code isn't really thread-safe. */ if (!this->m_valueSet) { float loc[2], scale, angle; loc[0] = 0.0f; @@ -61,6 +63,14 @@ void MovieClipAttributeOperation::executePixelSampled(float output[4], this->m_value = loc[1]; break; } + if (this->m_invert) { + if (this->m_attribute != MCA_SCALE) { + this->m_value = -this->m_value; + } + else { + this->m_value = 1.0f / this->m_value; + } + } this->m_valueSet = true; } output[0] = this->m_value; diff --git a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h index 49c86c7fafc..731b9debaf0 100644 --- a/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h +++ b/source/blender/compositor/operations/COM_MovieClipAttributeOperation.h @@ -41,6 +41,7 @@ private: float m_value; bool m_valueSet; int m_framenumber; + bool m_invert; MovieClipAttribute m_attribute; public: /** @@ -57,5 +58,6 @@ public: void setMovieClip(MovieClip *clip) { this->m_clip = clip; } void setFramenumber(int framenumber) { this->m_framenumber = framenumber; } void setAttribute(MovieClipAttribute attribute) { this->m_attribute = attribute; } + void setInvert(bool invert) { this->m_invert = invert; } }; #endif |