Blender  V3.3
COM_TrackPositionNode.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2012 Blender Foundation. */
3 
5 
6 #include "COM_ConvertOperation.h"
8 
9 #include "DNA_movieclip_types.h"
10 
11 #include "BKE_node.h"
12 
13 namespace blender::compositor {
14 
15 TrackPositionNode::TrackPositionNode(bNode *editor_node) : Node(editor_node)
16 {
17  /* pass */
18 }
19 
21  MovieClip *clip,
22  NodeTrackPosData *trackpos_data,
23  int axis,
24  int frame_number,
25  int delta)
26 {
28  operation->set_movie_clip(clip);
29  operation->set_tracking_object(trackpos_data->tracking_object);
30  operation->set_track_name(trackpos_data->track_name);
31  operation->set_framenumber(frame_number);
32  operation->set_axis(axis);
34  operation->set_relative_frame(frame_number + delta);
35  operation->set_speed_output(true);
36  converter.add_operation(operation);
37  return operation;
38 }
39 
41  const CompositorContext &context) const
42 {
43  bNode *editor_node = this->get_bnode();
44  MovieClip *clip = (MovieClip *)editor_node->id;
45  NodeTrackPosData *trackpos_data = (NodeTrackPosData *)editor_node->storage;
46 
47  NodeOutput *outputX = this->get_output_socket(0);
48  NodeOutput *outputY = this->get_output_socket(1);
49  NodeOutput *output_speed = this->get_output_socket(2);
50 
51  int frame_number;
52  if (editor_node->custom1 == CMP_TRACKPOS_ABSOLUTE_FRAME) {
53  frame_number = editor_node->custom2;
54  }
55  else {
56  frame_number = context.get_framenumber();
57  }
58 
60  operationX->set_movie_clip(clip);
61  operationX->set_tracking_object(trackpos_data->tracking_object);
62  operationX->set_track_name(trackpos_data->track_name);
63  operationX->set_framenumber(frame_number);
64  operationX->set_axis(0);
65  operationX->set_position(editor_node->custom1);
66  operationX->set_relative_frame(editor_node->custom2);
67  converter.add_operation(operationX);
68  converter.map_output_socket(outputX, operationX->get_output_socket());
69 
71  operationY->set_movie_clip(clip);
72  operationY->set_tracking_object(trackpos_data->tracking_object);
73  operationY->set_track_name(trackpos_data->track_name);
74  operationY->set_framenumber(frame_number);
75  operationY->set_axis(1);
76  operationY->set_position(editor_node->custom1);
77  operationY->set_relative_frame(editor_node->custom2);
78  converter.add_operation(operationY);
79  converter.map_output_socket(outputY, operationY->get_output_socket());
80 
81  TrackPositionOperation *operationMotionPreX = create_motion_operation(
82  converter, clip, trackpos_data, 0, frame_number, -1);
83  TrackPositionOperation *operationMotionPreY = create_motion_operation(
84  converter, clip, trackpos_data, 1, frame_number, -1);
85  TrackPositionOperation *operationMotionPostX = create_motion_operation(
86  converter, clip, trackpos_data, 0, frame_number, 1);
87  TrackPositionOperation *operationMotionPostY = create_motion_operation(
88  converter, clip, trackpos_data, 1, frame_number, 1);
89 
90  CombineChannelsOperation *combine_operation = new CombineChannelsOperation();
91  converter.add_operation(combine_operation);
92  converter.add_link(operationMotionPreX->get_output_socket(),
93  combine_operation->get_input_socket(0));
94  converter.add_link(operationMotionPreY->get_output_socket(),
95  combine_operation->get_input_socket(1));
96  converter.add_link(operationMotionPostX->get_output_socket(),
97  combine_operation->get_input_socket(2));
98  converter.add_link(operationMotionPostY->get_output_socket(),
99  combine_operation->get_input_socket(3));
100  converter.map_output_socket(output_speed, combine_operation->get_output_socket());
101 }
102 
103 } // namespace blender::compositor
#define CMP_TRACKPOS_ABSOLUTE_FRAME
Definition: BKE_node.h:1328
#define CMP_TRACKPOS_ABSOLUTE
Definition: BKE_node.h:1325
Overall context of the compositor.
void add_link(NodeOperationOutput *from, NodeOperationInput *to)
void map_output_socket(NodeOutput *node_socket, NodeOperationOutput *operation_socket)
void add_operation(NodeOperation *operation)
NodeOperationOutput * get_output_socket(unsigned int index=0)
NodeOperationInput * get_input_socket(unsigned int index)
NodeOutput are sockets that can send data/input.
Definition: COM_Node.h:238
NodeOutput * get_output_socket(unsigned int index=0) const
Definition: COM_Node.cc:84
bNode * get_bnode() const
get the reference to the SDNA bNode struct
Definition: COM_Node.h:64
void convert_to_operations(NodeConverter &converter, const CompositorContext &context) const override
convert node to operation
static TrackPositionOperation * create_motion_operation(NodeConverter &converter, MovieClip *clip, NodeTrackPosData *trackpos_data, int axis, int frame_number, int delta)
char tracking_object[64]
short custom1
struct ID * id
void * storage
short custom2