diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-12-15 11:51:09 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-12-15 11:57:15 +0300 |
commit | 2339a84443c07011acded1968a73b311b277101a (patch) | |
tree | a58d6b2ee3d2f6518a89be76a539ce77975c411a /source/blender/compositor | |
parent | 879889c47c12ef8eb4aea7eee3ab63a2ec3540d5 (diff) |
Compositor: Expose track velocity via the Track Position node
velocity is measured in pixels per frame. It is basically a coordinate
difference of track coordinate at current frame and previous one (no future
prediction happens).
It's not really most intuitive place for such a things, but historically the
node was called this way..
Track velocity could be used to face effects like motion blur bu piping it
to the vector blur node.
Reviewers: campbellbarton
Reviewed By: campbellbarton
Subscribers: hype, sebastian_k
Differential Revision: https://developer.blender.org/D1591
Diffstat (limited to 'source/blender/compositor')
3 files changed, 41 insertions, 3 deletions
diff --git a/source/blender/compositor/nodes/COM_TrackPositionNode.cpp b/source/blender/compositor/nodes/COM_TrackPositionNode.cpp index 75c8c786ae8..7f23798b768 100644 --- a/source/blender/compositor/nodes/COM_TrackPositionNode.cpp +++ b/source/blender/compositor/nodes/COM_TrackPositionNode.cpp @@ -44,6 +44,8 @@ void TrackPositionNode::convertToOperations(NodeConverter &converter, const Comp NodeOutput *outputX = this->getOutputSocket(0); NodeOutput *outputY = this->getOutputSocket(1); + NodeOutput *outputSpeedX = this->getOutputSocket(2); + NodeOutput *outputSpeedY = this->getOutputSocket(3); int frame_number; if (editorNode->custom1 == CMP_TRACKPOS_ABSOLUTE_FRAME) { @@ -62,7 +64,7 @@ void TrackPositionNode::convertToOperations(NodeConverter &converter, const Comp operationX->setPosition(editorNode->custom1); operationX->setRelativeFrame(editorNode->custom2); converter.addOperation(operationX); - + TrackPositionOperation *operationY = new TrackPositionOperation(); operationY->setMovieClip(clip); operationY->setTrackingObject(trackpos_data->tracking_object); @@ -72,7 +74,31 @@ void TrackPositionNode::convertToOperations(NodeConverter &converter, const Comp operationY->setPosition(editorNode->custom1); operationY->setRelativeFrame(editorNode->custom2); converter.addOperation(operationY); - + + TrackPositionOperation *operationSpeedX = new TrackPositionOperation(); + operationSpeedX->setMovieClip(clip); + operationSpeedX->setTrackingObject(trackpos_data->tracking_object); + operationSpeedX->setTrackName(trackpos_data->track_name); + operationSpeedX->setFramenumber(frame_number); + operationSpeedX->setAxis(0); + operationSpeedX->setPosition(editorNode->custom1); + operationSpeedX->setRelativeFrame(editorNode->custom2); + operationSpeedX->setSpeedOutput(true); + converter.addOperation(operationSpeedX); + + TrackPositionOperation *operationSpeedY = new TrackPositionOperation(); + operationSpeedY->setMovieClip(clip); + operationSpeedY->setTrackingObject(trackpos_data->tracking_object); + operationSpeedY->setTrackName(trackpos_data->track_name); + operationSpeedY->setFramenumber(frame_number); + operationSpeedY->setAxis(1); + operationSpeedY->setPosition(editorNode->custom1); + operationSpeedY->setRelativeFrame(editorNode->custom2); + operationSpeedY->setSpeedOutput(true); + converter.addOperation(operationSpeedY); + converter.mapOutputSocket(outputX, operationX->getOutputSocket()); converter.mapOutputSocket(outputY, operationY->getOutputSocket()); + converter.mapOutputSocket(outputSpeedX, operationSpeedX->getOutputSocket()); + converter.mapOutputSocket(outputSpeedY, operationSpeedY->getOutputSocket()); } diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.cpp b/source/blender/compositor/operations/COM_TrackPositionOperation.cpp index ca169d03fbc..52ceb50e693 100644 --- a/source/blender/compositor/operations/COM_TrackPositionOperation.cpp +++ b/source/blender/compositor/operations/COM_TrackPositionOperation.cpp @@ -45,6 +45,7 @@ TrackPositionOperation::TrackPositionOperation() : NodeOperation() this->m_axis = 0; this->m_position = CMP_TRACKPOS_ABSOLUTE; this->m_relativeFrame = 0; + this->m_speed_output = false; } void TrackPositionOperation::initExecution() @@ -78,7 +79,16 @@ void TrackPositionOperation::initExecution() copy_v2_v2(this->m_markerPos, marker->pos); - if (this->m_position == CMP_TRACKPOS_RELATIVE_START) { + if (this->m_speed_output) { + marker = BKE_tracking_marker_get(track, clip_framenr - 1); + if ((marker->flag & MARKER_DISABLED) == 0) { + copy_v2_v2(this->m_relativePos, marker->pos); + } + else { + copy_v2_v2(this->m_relativePos, this->m_markerPos); + } + } + else if (this->m_position == CMP_TRACKPOS_RELATIVE_START) { int i; for (i = 0; i < track->markersnr; i++) { diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.h b/source/blender/compositor/operations/COM_TrackPositionOperation.h index 10dbaf96646..a5a58ad9f09 100644 --- a/source/blender/compositor/operations/COM_TrackPositionOperation.h +++ b/source/blender/compositor/operations/COM_TrackPositionOperation.h @@ -47,6 +47,7 @@ protected: int m_axis; int m_position; int m_relativeFrame; + bool m_speed_output; int m_width, m_height; float m_markerPos[2]; @@ -67,6 +68,7 @@ public: void setAxis(int value) {this->m_axis = value;} void setPosition(int value) {this->m_position = value;} void setRelativeFrame(int value) {this->m_relativeFrame = value;} + void setSpeedOutput(bool speed_output) {this->m_speed_output = speed_output;}; void initExecution(); |