diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-07-27 15:07:12 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-07-27 15:07:12 +0400 |
commit | 18e874798d68e4796146e9f5958f66dc3ea61909 (patch) | |
tree | 8fac06b4ab2345a1e9baa85f92fad7d06dae7ac6 /source | |
parent | d0b387a0dfcb259a36d7bff3c6bdd63ee0e5a1d9 (diff) |
Track input node: more control on over output value
Now supports output value of:
- Absolute marker position
- Marker position relative to the very first marker
- Marker position relative to given scene frame
Diffstat (limited to 'source')
5 files changed, 47 insertions, 11 deletions
diff --git a/source/blender/compositor/nodes/COM_TrackPositionNode.cpp b/source/blender/compositor/nodes/COM_TrackPositionNode.cpp index 58b26eb7128..f4efcfe27f0 100644 --- a/source/blender/compositor/nodes/COM_TrackPositionNode.cpp +++ b/source/blender/compositor/nodes/COM_TrackPositionNode.cpp @@ -52,14 +52,16 @@ void TrackPositionNode::convertToOperations(ExecutionSystem *graph, CompositorCo operationX->setTrackName(trackpos_data->track_name); operationX->setFramenumber(context->getFramenumber()); operationX->setAxis(0); - operationX->setRelative(editorNode->custom1); + operationX->setPosition(editorNode->custom1); + operationX->setRelativeFrame(editorNode->custom2); operationY->setMovieClip(clip); operationY->setTrackingObject(trackpos_data->tracking_object); operationY->setTrackName(trackpos_data->track_name); operationY->setFramenumber(context->getFramenumber()); operationY->setAxis(1); - operationY->setRelative(editorNode->custom1); + operationY->setPosition(editorNode->custom1); + operationY->setRelativeFrame(editorNode->custom2); outputX->relinkConnections(operationX->getOutputSocket()); outputY->relinkConnections(operationY->getOutputSocket()); diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.cpp b/source/blender/compositor/operations/COM_TrackPositionOperation.cpp index d61bfd4b235..2b7cc8f0660 100644 --- a/source/blender/compositor/operations/COM_TrackPositionOperation.cpp +++ b/source/blender/compositor/operations/COM_TrackPositionOperation.cpp @@ -44,7 +44,8 @@ TrackPositionOperation::TrackPositionOperation() : NodeOperation() this->m_trackingObjectName[0] = 0; this->m_trackName[0] = 0; this->m_axis = 0; - this->m_relative = false; + this->m_position = POSITION_ABSOLUTE;; + this->m_relativeFrame = 0; } void TrackPositionOperation::initExecution() @@ -72,12 +73,13 @@ void TrackPositionOperation::initExecution() if (track) { MovieTrackingMarker *marker; + int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(this->m_movieClip, this->m_framenumber); - marker = BKE_tracking_marker_get(track, this->m_framenumber); + marker = BKE_tracking_marker_get(track, clip_framenr); copy_v2_v2(this->m_markerPos, marker->pos); - if (this->m_relative) { + if (this->m_position == POSITION_RELATIVE_START) { int i; for (i = 0; i < track->markersnr; i++) { @@ -90,6 +92,13 @@ void TrackPositionOperation::initExecution() } } } + else if (this->m_position == POSITION_RELATIVE_FRAME) { + int relative_clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(this->m_movieClip, + this->m_relativeFrame); + + marker = BKE_tracking_marker_get(track, relative_clip_framenr); + copy_v2_v2(this->m_relativePos, marker->pos); + } } } } diff --git a/source/blender/compositor/operations/COM_TrackPositionOperation.h b/source/blender/compositor/operations/COM_TrackPositionOperation.h index 537974e733a..3f6f237e5ea 100644 --- a/source/blender/compositor/operations/COM_TrackPositionOperation.h +++ b/source/blender/compositor/operations/COM_TrackPositionOperation.h @@ -40,12 +40,19 @@ */ class TrackPositionOperation : public NodeOperation { protected: + enum { + POSITION_ABSOLUTE = 0, + POSITION_RELATIVE_START, + POSITION_RELATIVE_FRAME + }; + MovieClip *m_movieClip; int m_framenumber; char m_trackingObjectName[64]; char m_trackName[64]; int m_axis; - bool m_relative; + int m_position; + int m_relativeFrame; int m_width, m_height; float m_markerPos[2]; @@ -64,7 +71,8 @@ public: void setTrackName(char *track) {strncpy(this->m_trackName, track, sizeof(this->m_trackName));} void setFramenumber(int framenumber) {this->m_framenumber = framenumber;} void setAxis(int value) {this->m_axis = value;} - void setRelative(bool value) {this->m_relative = value;} + void setPosition(int value) {this->m_position = value;} + void setRelativeFrame(int value) {this->m_relativeFrame = value;} void initExecution(); diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index b3ae8d3e939..6aec69ca61a 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -2577,7 +2577,11 @@ static void node_composit_buts_trackpos(uiLayout *layout, bContext *C, PointerRN uiItemR(layout, ptr, "track_name", 0, "", ICON_ANIM_DATA); } - uiItemR(layout, ptr, "use_relative", 0, NULL, ICON_NONE); + uiItemR(layout, ptr, "position", 0, NULL, ICON_NONE); + + if (node->custom1 == 2) { + uiItemR(layout, ptr, "relative_frame", 0, NULL, ICON_NONE); + } } } diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 4f259e80f25..6b380886e28 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -3730,6 +3730,13 @@ static void def_cmp_trackpos(StructRNA *srna) { PropertyRNA *prop; + static EnumPropertyItem position_items[] = { + {0, "ABSOLUTE", 0, "Absolute", "Output absolute position of a marker"}, + {1, "RELATIVE_START", 0, "Relative Start", "Output position of a marker relative to first marker of a track"}, + {2, "RELATIVE_FRAME", 0, "Relative Frame", "Output position of a marker relative to marker at given frame number"}, + {0, NULL, 0, NULL, NULL} + }; + prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "id"); RNA_def_property_struct_type(prop, "MovieClip"); @@ -3737,9 +3744,15 @@ static void def_cmp_trackpos(StructRNA *srna) RNA_def_property_ui_text(prop, "Movie Clip", ""); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); - prop = RNA_def_property(srna, "use_relative", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1); - RNA_def_property_ui_text(prop, "Relative", "Return relative position to first track's marker"); + prop = RNA_def_property(srna, "position", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom1"); + RNA_def_property_enum_items(prop, position_items); + RNA_def_property_ui_text(prop, "Position", "Which marker position to use for output"); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "relative_frame", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "custom2"); + RNA_def_property_ui_text(prop, "Frame", "Frame to be used for relative position"); RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); RNA_def_struct_sdna_from(srna, "NodeTrackPosData", "storage"); |