24#include "RNA_prototypes.hh"
46 b.use_custom_socket_order();
47 b.allow_any_socket_order();
52 .structure_type(StructureType::Dynamic);
66 &clip->
id, &RNA_MovieTracking, tracking);
69 col->prop_search(
ptr,
"tracking_object", &tracking_ptr,
"objects",
"", ICON_OBJECT_DATA);
72 node_storage(*node).tracking_object);
73 if (tracking_object) {
75 &clip->
id, &RNA_MovieTrackingObject, tracking_object);
77 col->prop_search(
ptr,
"plane_track_name", &object_ptr,
"plane_tracks",
"", ICON_ANIM_DATA);
89 .description(
"Use multi-sampled motion blur of the plane");
94 .description(
"Number of motion blur samples");
100 .description(
"Exposure for motion blur as a factor of FPS");
115 node->
id = &clip->
id;
154 if (this->
context().use_gpu()) {
166 homography_matrices.
data(),
167 "Plane Track Deform Homography Matrices");
170 homography_matrices_buffer);
172 smaa(
context(), plane_mask, anti_aliased_plane_mask);
178 homography_matrices, homography_matrices_buffer, anti_aliased_plane_mask);
185 output_mask.
steal_data(anti_aliased_plane_mask);
188 anti_aliased_plane_mask.
release();
257 smaa(
context(), plane_mask, anti_aliased_plane_mask);
267 output_mask.
steal_data(anti_aliased_plane_mask);
270 anti_aliased_plane_mask.
release();
280 output.allocate_texture(domain);
287 for (
const float4x4 &homography_matrix : homography_matrices) {
290 if (transformed_coordinates.z == 0.0f) {
293 float2 projected_coordinates = transformed_coordinates.
xy() / transformed_coordinates.z;
299 float2 x_gradient = (homography_matrix[0].xy() / transformed_coordinates.z) /
size.x;
300 float2 y_gradient = (homography_matrix[1].xy() / transformed_coordinates.z) /
size.y;
303 projected_coordinates, x_gradient, y_gradient);
304 accumulated_color += sampled_color;
307 accumulated_color /= homography_matrices.size();
310 float4 plane_color = accumulated_color * plane_mask.
load_pixel<
float>(texel);
312 output.store_pixel(texel, plane_color);
326 float accumulated_mask = 0.0f;
327 for (
const float4x4 &homography_matrix : homography_matrices) {
330 if (transformed_coordinates.z == 0.0f) {
333 float2 projected_coordinates = transformed_coordinates.
xy() / transformed_coordinates.z;
335 bool is_inside_plane = projected_coordinates.x >= 0.0f &&
336 projected_coordinates.y >= 0.0f &&
337 projected_coordinates.x <= 1.0f && projected_coordinates.y <= 1.0f;
338 accumulated_mask += is_inside_plane ? 1.0f : 0.0f;
341 accumulated_mask /= homography_matrices.size();
355 return input_image.
domain();
368 const float frame_step = (shutter * 2.0f) / samples;
371 for (
int i = 0;
i < samples;
i++) {
372 const float frame = start_frame + frame_step *
i;
381 float identity_corners[4][2] = {{0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}};
383 corners, identity_corners, homography_matrix.
ptr());
386 matrices[
i] =
float4x4(homography_matrix);
401 &movie_clip->
tracking, node_storage(
bnode()).tracking_object);
403 if (!tracking_object) {
408 node_storage(
bnode()).plane_track_name);
424 this->
get_input(
"Motion Blur Samples").get_single_value_default(16), 1, 64);
431 this->
get_input(
"Motion Blur Shutter").get_single_value_default(0.5f), 0.0f, 1.0f);
459 ntype.
ui_name =
"Plane Track Deform";
461 "Replace flat planes in footage by another image, detected by plane tracks from motion "
465 ntype.
declare = file_ns::cmp_node_planetrackdeform_declare;
Scene * CTX_data_scene(const bContext *C)
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)
#define NODE_STORAGE_FUNCS(StorageT)
#define NODE_CLASS_DISTORT
#define CMP_NODE_PLANETRACKDEFORM
struct MovieTrackingPlaneTrack * BKE_tracking_object_find_plane_track_with_name(struct MovieTrackingObject *tracking_object, const char *name)
struct MovieTrackingObject * BKE_tracking_object_get_named(struct MovieTracking *tracking, const char *name)
struct MovieTrackingObject * BKE_tracking_object_get_active(const struct MovieTracking *tracking)
void BKE_tracking_plane_marker_get_subframe_corners(struct MovieTrackingPlaneTrack *plane_track, float framenr, float corners[4][2])
void BKE_tracking_homography_between_two_quads(float reference_corners[4][2], float corners[4][2], float H[3][3])
#define STRNCPY_UTF8(dst, src)
#define DNA_struct_default_get(struct_name)
int GPU_shader_get_ubo_binding(blender::gpu::Shader *shader, const char *name)
void GPU_shader_bind(blender::gpu::Shader *shader, const blender::gpu::shader::SpecializationConstants *constants_state=nullptr)
void GPU_shader_uniform_1i(blender::gpu::Shader *sh, const char *name, int value)
void GPU_texture_anisotropic_filter(blender::gpu::Texture *texture, bool use_aniso)
void GPU_texture_extend_mode(blender::gpu::Texture *texture, GPUSamplerExtendMode extend_mode)
void GPU_texture_mipmap_mode(blender::gpu::Texture *texture, bool use_mipmap, bool use_filter)
@ GPU_SAMPLER_EXTEND_MODE_EXTEND
#define NOD_REGISTER_NODE(REGISTER_FUNC)
void uiTemplateID(uiLayout *layout, const bContext *C, PointerRNA *ptr, blender::StringRefNull propname, const char *newop, const char *openop, const char *unlinkop, int filter=UI_TEMPLATE_ID_FILTER_ALL, bool live_icon=false, std::optional< blender::StringRef > text=std::nullopt)
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Result create_result(ResultType type, ResultPrecision precision)
int get_frame_number() const
gpu::Shader * get_shader(const char *info_name, ResultPrecision precision)
const bNode & bnode() const
NodeOperation(Context &context, DNode node)
Result & get_result(StringRef identifier)
Context & context() const
Result & get_input(StringRef identifier) const
void share_data(const Result &source)
T get_single_value_default(const T &default_value) const
void store_pixel(const int2 &texel, const T &pixel_value)
void allocate_texture(const Domain domain, const bool from_pool=true, const std::optional< ResultStorageType > storage_type=std::nullopt)
void unbind_as_texture() const
void set_single_value(const T &value)
void bind_as_texture(gpu::Shader *shader, const char *texture_name) const
const Domain & domain() const
T load_pixel(const int2 &texel) const
void unbind_as_image() const
void allocate_single_value()
void bind_as_image(gpu::Shader *shader, const char *image_name, bool read=false) const
bool is_single_value() const
void steal_data(Result &source)
DeclType::Builder & add_input(StringRef name, StringRef identifier="")
StructureType structure_type
void * MEM_callocN(size_t len, const char *str)
void node_register_type(bNodeType &ntype)
void node_type_storage(bNodeType &ntype, std::optional< StringRefNull > storagename, void(*freefunc)(bNode *node), void(*copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node))
void compute_dispatch_threads_at_least(gpu::Shader *shader, int2 threads_range, int2 local_size=int2(16))
void smaa(Context &context, const Result &input, Result &output, const float threshold=0.1f, const float local_contrast_adaptation_factor=2.0f, const int corner_rounding=25)
void parallel_for(const int2 range, const Function &function)
T clamp(const T &a, const T &min, const T &max)
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2
MatBase< float, 3, 3 > float3x3
VecBase< float, 3 > float3
void cmp_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
void node_free_standard_storage(bNode *node)
void node_copy_standard_storage(bNodeTree *, bNode *dest_node, const bNode *src_node)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
struct MovieTracking tracking
MovieTrackingPlaneTrack * active_plane_track
const c_style_mat & ptr() const
VecBase< T, 2 > xy() const
std::string ui_description
NodeGetCompositorOperationFunction get_compositor_operation
const char * enum_name_legacy
NodeDeclareFunction declare
void(* initfunc_api)(const bContext *C, PointerRNA *ptr)
uiLayout & column(bool align)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)