88 image_buffer, track, marker,
true,
false);
89 if (!pattern_image_buffer) {
95 for (
int i = 0;
i < pattern_image_buffer->
x * pattern_image_buffer->
y;
i++) {
103 mean_color += linear_color;
106 mean_color /= pattern_image_buffer->
x * pattern_image_buffer->
y;
108 marker_colors.
append(mean_color);
109 marker_positions.
append(position);
121 const int scene_frame = context.get_frame_number();
124 return movie_clip_user;
130 const float smoothness)
140 movie_clip, movie_clip_user, movie_tracking_object, marker_positions, marker_colors);
147 if (context.use_gpu()) {
148 this->compute_gpu(context, smoothness, marker_positions, marker_colors);
151 this->compute_cpu(smoothness, marker_positions, marker_colors);
155void KeyingScreen::compute_gpu(
Context &context,
156 const float smoothness,
160 gpu::Shader *shader = context.get_shader(
"compositor_keying_screen");
171 if (marker_positions.
size() % 2 == 1) {
177 marker_positions.
data(),
184 marker_colors.
data(),
190 this->
result.bind_as_image(shader,
"output_img");
194 this->
result.unbind_as_image();
203void KeyingScreen::compute_cpu(
const float smoothness,
207 float squared_shape_parameter =
math::square(1.0f / smoothness);
215 float sum_of_weights = 0.0f;
218 float2 marker_position = marker_positions[
i];
219 float2 difference = normalized_pixel_location - marker_position;
220 float squared_distance =
math::dot(difference, difference);
221 float gaussian =
math::exp(-squared_distance * squared_shape_parameter);
223 float4 marker_color = marker_colors[
i];
224 weighted_sum += marker_color * gaussian;
225 sum_of_weights += gaussian;
227 weighted_sum /= sum_of_weights;
229 this->
result.store_pixel(texel, weighted_sum);
245 for (
auto &cached_keying_screens_for_id : map_.values()) {
246 cached_keying_screens_for_id.remove_if([](
auto item) {
return !item.value->needed; });
248 map_.remove_if([](
auto item) {
return item.value.is_empty(); });
252 for (
auto &cached_keying_screens_for_id : map_.values()) {
253 for (
auto &value : cached_keying_screens_for_id.values()) {
254 value->needed =
false;
268 const std::string library_key = movie_clip->
id.
lib ? movie_clip->
id.
lib->
id.
name :
"";
269 const std::string id_key = std::string(movie_clip->
id.
name) + library_key;
270 const std::string object_key = id_key + movie_tracking_object->
name;
271 auto &cached_keying_screens_for_id = map_.lookup_or_add_default(object_key);
274 if (!cached_keying_screens_for_id.is_empty() &&
277 cached_keying_screens_for_id.clear();
280 auto &keying_screen = *cached_keying_screens_for_id.lookup_or_add_cb(key, [&]() {
281 return std::make_unique<KeyingScreen>(context, movie_clip, movie_tracking_object, smoothness);
287 keying_screen.needed =
true;
288 return keying_screen.result;
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 MovieTrackingMarker * BKE_tracking_marker_get(struct MovieTrackingTrack *track, int framenr)
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 LISTBASE_FOREACH(type, var, list)
MINLINE void srgb_to_linearrgb_uchar4(float linear[4], const unsigned char srgb[4])
#define DNA_struct_default_get(struct_name)
void GPU_shader_uniform_1f(blender::gpu::Shader *sh, const char *name, float value)
void GPU_shader_bind(blender::gpu::Shader *shader, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
int GPU_shader_get_ssbo_binding(blender::gpu::Shader *shader, const char *name)
void GPU_shader_uniform_1i(blender::gpu::Shader *sh, const char *name, int value)
void GPU_storagebuf_free(blender::gpu::StorageBuf *ssbo)
blender::gpu::StorageBuf * GPU_storagebuf_create_ex(size_t size, const void *data, GPUUsageType usage, const char *name)
void GPU_storagebuf_bind(blender::gpu::StorageBuf *ssbo, int slot)
void GPU_storagebuf_unbind(blender::gpu::StorageBuf *ssbo)
void IMB_freeImBuf(ImBuf *ibuf)
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
IndexRange index_range() const
void append(const T &value)
Result & get(Context &context, MovieClip *movie_clip, MovieTrackingObject *movie_tracking_object, float smoothness)
KeyingScreenKey(int frame, float smoothness)
KeyingScreen(Context &context, MovieClip *movie_clip, MovieTrackingObject *movie_tracking_object, const float smoothness)
void compute_dispatch_threads_at_least(gpu::Shader *shader, int2 threads_range, int2 local_size=int2(16))
static MovieClipUser get_movie_clip_user(Context &context, MovieClip *movie_clip)
bool operator==(const BokehKernelKey &a, const BokehKernelKey &b)
static void compute_marker_points(MovieClip *movie_clip, MovieClipUser &movie_clip_user, MovieTrackingObject *movie_tracking_object, Vector< float2 > &marker_positions, Vector< float4 > &marker_colors)
void parallel_for(const int2 range, const Function &function)
T clamp(const T &a, const T &min, const T &max)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
blender::VecBase< uint8_t, 4 > uchar4
VecBase< float, 4 > float4
uint64_t get_default_hash(const T &v, const Args &...args)
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
struct MovieClip_Runtime runtime