Blender V4.3
COM_KeyingScreenOperation.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2012 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
7#include "DNA_defaults.h"
8
9#include "BLI_array.hh"
10#include "BLI_math_color.h"
11#include "BLI_math_geom.h"
12#include "BLI_math_vector.hh"
14
15#include "BKE_movieclip.h"
16#include "BKE_tracking.h"
17
18#include "IMB_imbuf.hh"
19#include "IMB_imbuf_types.hh"
20
21namespace blender::compositor {
22
31
39
45
47{
49
50 const MovieTrackingObject *tracking_object = nullptr;
51 if (tracking_object_[0]) {
52 tracking_object = BKE_tracking_object_get_named(tracking, tracking_object_);
53 if (!tracking_object) {
54 return nullptr;
55 }
56 }
57 else {
58 tracking_object = BKE_tracking_object_get_active(tracking);
59 }
60 BLI_assert(tracking_object != nullptr);
61
63
64 /* count sites */
65 int sites_total = 0;
66 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
67 const MovieTrackingMarker *marker = BKE_tracking_marker_get(track, clip_frame);
68
69 if (marker->flag & MARKER_DISABLED) {
70 continue;
71 }
72
73 float pos[2];
74 add_v2_v2v2(pos, marker->pos, track->offset);
75
76 if (!IN_RANGE_INCL(pos[0], 0.0f, 1.0f) || !IN_RANGE_INCL(pos[1], 0.0f, 1.0f)) {
77 continue;
78 }
79
80 sites_total++;
81 }
82
83 if (!sites_total) {
84 return nullptr;
85 }
86
88 BKE_movieclip_user_set_frame(&user, clip_frame);
90
91 if (!ibuf) {
92 return nullptr;
93 }
94
95 Array<MarkerPoint> *marker_points = new Array<MarkerPoint>(sites_total);
96
97 int track_index = 0;
98 LISTBASE_FOREACH_INDEX (MovieTrackingTrack *, track, &tracking_object->tracks, track_index) {
99 const MovieTrackingMarker *marker = BKE_tracking_marker_get(track, clip_frame);
100 if (marker->flag & MARKER_DISABLED) {
101 continue;
102 }
103
104 const float2 position = float2(marker->pos) + float2(track->offset);
105
106 if (!IN_RANGE_INCL(position.x, 0.0f, 1.0f) || !IN_RANGE_INCL(position.y, 0.0f, 1.0f)) {
107 continue;
108 }
109
110 ImBuf *pattern_ibuf = BKE_tracking_get_pattern_imbuf(ibuf, track, marker, true, false);
111
112 MarkerPoint &marker_point = (*marker_points)[track_index];
113 marker_point.position = position;
114
115 marker_point.color = float4(0.0f);
116 if (pattern_ibuf) {
117 for (int j = 0; j < pattern_ibuf->x * pattern_ibuf->y; j++) {
118 if (pattern_ibuf->float_buffer.data) {
119 marker_point.color += float4(&pattern_ibuf->float_buffer.data[4 * j]);
120 }
121 else {
122 uchar *rrgb = pattern_ibuf->byte_buffer.data;
123 marker_point.color += float4(srgb_to_linearrgb(float(rrgb[4 * j + 0]) / 255.0f),
124 srgb_to_linearrgb(float(rrgb[4 * j + 1]) / 255.0f),
125 srgb_to_linearrgb(float(rrgb[4 * j + 2]) / 255.0f),
126 srgb_to_linearrgb(float(rrgb[4 * j + 3]) / 255.0f));
127 }
128 }
129
130 marker_point.color /= pattern_ibuf->x * pattern_ibuf->y;
131 IMB_freeImBuf(pattern_ibuf);
132 }
133 }
134
135 IMB_freeImBuf(ibuf);
136
137 return marker_points;
138}
139
140void KeyingScreenOperation::determine_canvas(const rcti &preferred_area, rcti &r_area)
141{
142 r_area = COM_AREA_NONE;
143
144 if (movie_clip_) {
146 int width, height;
148
149 BKE_movieclip_user_set_frame(&user, clip_frame);
150 BKE_movieclip_get_size(movie_clip_, &user, &width, &height);
151 r_area = preferred_area;
152 r_area.xmax = r_area.xmin + width;
153 r_area.ymax = r_area.ymin + height;
154 }
155}
156
158 const rcti &area,
160{
162 output->fill(area, COM_COLOR_TRANSPARENT);
163 return;
164 }
165
166 const int2 size = int2(this->get_width(), this->get_height());
167 const float squared_shape_parameter = math::square(1.0f / smoothness_);
168
169 for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
170 const float2 normalized_pixel_location = float2(it.x, it.y) / float2(size);
171
172 float4 weighted_sum = float4(0.0f);
173 float sum_of_weights = 0.0f;
174 for (const MarkerPoint &marker_point : *cached_marker_points_) {
175 const float2 difference = normalized_pixel_location - marker_point.position;
176 const float squared_distance = math::dot(difference, difference);
177 const float gaussian = math::exp(-squared_distance * squared_shape_parameter);
178 weighted_sum += marker_point.color * gaussian;
179 sum_of_weights += gaussian;
180 }
181 weighted_sum /= sum_of_weights;
182
183 copy_v4_v4(it.out, weighted_sum);
184 }
185}
186
187} // namespace blender::compositor
float BKE_movieclip_remap_scene_to_clip_frame(const struct MovieClip *clip, float framenr)
void BKE_movieclip_user_set_frame(struct MovieClipUser *user, int framenr)
void BKE_movieclip_get_size(struct MovieClip *clip, const struct MovieClipUser *user, int *r_width, int *r_height)
struct ImBuf * BKE_movieclip_get_ibuf(struct MovieClip *clip, const struct MovieClipUser *user)
struct MovieTrackingObject * BKE_tracking_object_get_named(struct MovieTracking *tracking, const char *name)
Definition tracking.cc:1966
struct MovieTrackingMarker * BKE_tracking_marker_get(struct MovieTrackingTrack *track, int framenr)
Definition tracking.cc:1358
struct MovieTrackingObject * BKE_tracking_object_get_active(const struct MovieTracking *tracking)
struct ImBuf * BKE_tracking_get_pattern_imbuf(const struct ImBuf *ibuf, const struct MovieTrackingTrack *track, const struct MovieTrackingMarker *marker, bool anchored, bool disable_channels)
#define BLI_assert(a)
Definition BLI_assert.h:50
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
float srgb_to_linearrgb(float c)
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2])
unsigned char uchar
#define IN_RANGE_INCL(a, b, c)
#define DNA_struct_default_get(struct_name)
@ MARKER_DISABLED
Contains defines and structs used throughout the imbuf module.
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
a MemoryBuffer contains access to the data
void add_output_socket(DataType datatype)
void IMB_freeImBuf(ImBuf *)
constexpr rcti COM_AREA_NONE
Definition COM_defines.h:89
constexpr float COM_COLOR_TRANSPARENT[4]
Definition COM_defines.h:60
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
T exp(const T &x)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
T square(const T &a)
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
struct MovieTracking tracking
int ymin
int ymax
int xmin
int xmax