UI: Asset Shelf (Experimental Feature) #104831

Closed
Julian Eisel wants to merge 399 commits from asset-shelf into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
3 changed files with 127 additions and 122 deletions
Showing only changes of commit 5292a80dce - Show all commits

View File

@ -155,12 +155,15 @@ ccl_device_inline void shader_setup_from_sample(KernelGlobals kg,
sd->Ng = Ng;
sd->wi = I;
sd->shader = shader;
if (prim != PRIM_NONE)
sd->type = PRIMITIVE_TRIANGLE;
else if (lamp != LAMP_NONE)
if (lamp != LAMP_NONE) {
sd->type = PRIMITIVE_LAMP;
else
}
else if (prim != PRIM_NONE) {
sd->type = PRIMITIVE_TRIANGLE;
}
else {
sd->type = PRIMITIVE_NONE;
}
/* primitive */
sd->object = object;

View File

@ -179,94 +179,98 @@ static void libmv_frame_to_normalized_relative(const float frame_coord[2],
/** \name Conversion of markers between Blender's DNA and Libmv.
* \{ */
static void dna_marker_to_libmv_marker(/*const*/ MovieTrackingTrack *track,
const MovieTrackingMarker *marker,
int clip,
int track_index,
int frame_width,
int frame_height,
bool backwards,
libmv_Marker *libmv_marker)
static libmv_Marker dna_marker_to_libmv_marker(/*const*/ MovieTrackingTrack &track,
const MovieTrackingMarker &marker,
const int clip,
const int track_index,
const int frame_width,
const int frame_height,
const bool backwards)
{
const int frame_dimensions[2] = {frame_width, frame_height};
libmv_marker->clip = clip;
libmv_marker->frame = marker->framenr;
libmv_marker->track = track_index;
libmv_Marker libmv_marker{};
normalized_to_libmv_frame(marker->pos, frame_dimensions, libmv_marker->center);
const int frame_dimensions[2] = {frame_width, frame_height};
libmv_marker.clip = clip;
libmv_marker.frame = marker.framenr;
libmv_marker.track = track_index;
normalized_to_libmv_frame(marker.pos, frame_dimensions, libmv_marker.center);
for (int i = 0; i < 4; i++) {
normalized_relative_to_libmv_frame(
marker->pattern_corners[i], marker->pos, frame_dimensions, libmv_marker->patch[i]);
marker.pattern_corners[i], marker.pos, frame_dimensions, libmv_marker.patch[i]);
}
normalized_relative_to_libmv_frame(
marker->search_min, marker->pos, frame_dimensions, libmv_marker->search_region_min);
marker.search_min, marker.pos, frame_dimensions, libmv_marker.search_region_min);
normalized_relative_to_libmv_frame(
marker->search_max, marker->pos, frame_dimensions, libmv_marker->search_region_max);
marker.search_max, marker.pos, frame_dimensions, libmv_marker.search_region_max);
/* NOTE: All the markers does have 1.0 weight.
* Might support in the future, but will require more elaborated process which will involve
* F-Curve evaluation. */
libmv_marker->weight = 1.0f;
libmv_marker.weight = 1.0f;
if (marker->flag & MARKER_TRACKED) {
libmv_marker->source = LIBMV_MARKER_SOURCE_TRACKED;
if (marker.flag & MARKER_TRACKED) {
libmv_marker.source = LIBMV_MARKER_SOURCE_TRACKED;
}
else {
libmv_marker->source = LIBMV_MARKER_SOURCE_MANUAL;
libmv_marker.source = LIBMV_MARKER_SOURCE_MANUAL;
}
libmv_marker->status = LIBMV_MARKER_STATUS_UNKNOWN;
libmv_marker->model_type = LIBMV_MARKER_MODEL_TYPE_POINT;
libmv_marker->model_id = 0;
libmv_marker.status = LIBMV_MARKER_STATUS_UNKNOWN;
libmv_marker.model_type = LIBMV_MARKER_MODEL_TYPE_POINT;
libmv_marker.model_id = 0;
/* NOTE: We currently don't support reference marker from different clip. */
libmv_marker->reference_clip = clip;
libmv_marker.reference_clip = clip;
if (track->pattern_match == TRACK_MATCH_KEYFRAME) {
if (track.pattern_match == TRACK_MATCH_KEYFRAME) {
const MovieTrackingMarker *keyframe_marker = tracking_get_keyframed_marker(
track, marker->framenr, backwards);
libmv_marker->reference_frame = keyframe_marker->framenr;
&track, marker.framenr, backwards);
libmv_marker.reference_frame = keyframe_marker->framenr;
}
else {
libmv_marker->reference_frame = backwards ? marker->framenr - 1 : marker->framenr;
libmv_marker.reference_frame = backwards ? marker.framenr - 1 : marker.framenr;
}
libmv_marker->disabled_channels =
((track->flag & TRACK_DISABLE_RED) ? LIBMV_MARKER_CHANNEL_R : 0) |
((track->flag & TRACK_DISABLE_GREEN) ? LIBMV_MARKER_CHANNEL_G : 0) |
((track->flag & TRACK_DISABLE_BLUE) ? LIBMV_MARKER_CHANNEL_B : 0);
libmv_marker.disabled_channels =
((track.flag & TRACK_DISABLE_RED) ? LIBMV_MARKER_CHANNEL_R : 0) |
((track.flag & TRACK_DISABLE_GREEN) ? LIBMV_MARKER_CHANNEL_G : 0) |
((track.flag & TRACK_DISABLE_BLUE) ? LIBMV_MARKER_CHANNEL_B : 0);
return libmv_marker;
}
static void libmv_marker_to_dna_marker(libmv_Marker *libmv_marker,
int frame_width,
int frame_height,
MovieTrackingMarker *marker)
static MovieTrackingMarker libmv_marker_to_dna_marker(const libmv_Marker &libmv_marker,
const int frame_width,
const int frame_height)
{
const int frame_dimensions[2] = {frame_width, frame_height};
marker->framenr = libmv_marker->frame;
MovieTrackingMarker marker{};
libmv_frame_to_normalized(libmv_marker->center, frame_dimensions, marker->pos);
const int frame_dimensions[2] = {frame_width, frame_height};
marker.framenr = libmv_marker.frame;
libmv_frame_to_normalized(libmv_marker.center, frame_dimensions, marker.pos);
for (int i = 0; i < 4; i++) {
libmv_frame_to_normalized_relative(libmv_marker->patch[i],
libmv_marker->center,
frame_dimensions,
marker->pattern_corners[i]);
libmv_frame_to_normalized_relative(
libmv_marker.patch[i], libmv_marker.center, frame_dimensions, marker.pattern_corners[i]);
}
libmv_frame_to_normalized_relative(
libmv_marker->search_region_min, libmv_marker->center, frame_dimensions, marker->search_min);
libmv_marker.search_region_min, libmv_marker.center, frame_dimensions, marker.search_min);
libmv_frame_to_normalized_relative(
libmv_marker->search_region_max, libmv_marker->center, frame_dimensions, marker->search_max);
libmv_marker.search_region_max, libmv_marker.center, frame_dimensions, marker.search_max);
marker->flag = 0;
if (libmv_marker->source == LIBMV_MARKER_SOURCE_TRACKED) {
marker->flag |= MARKER_TRACKED;
marker.flag = 0;
if (libmv_marker.source == LIBMV_MARKER_SOURCE_TRACKED) {
marker.flag |= MARKER_TRACKED;
}
else {
marker->flag &= ~MARKER_TRACKED;
marker.flag &= ~MARKER_TRACKED;
}
return marker;
}
/** \} */
@ -279,29 +283,28 @@ static void libmv_marker_to_dna_marker(libmv_Marker *libmv_marker,
* \{ */
/* Returns false if marker crossed margin area from frame bounds. */
static bool tracking_check_marker_margin(const libmv_Marker *libmv_marker,
int margin,
int frame_width,
int frame_height)
static bool tracking_check_marker_margin(const libmv_Marker &libmv_marker,
const int margin,
const int frame_width,
const int frame_height)
{
float patch_min[2], patch_max[2];
float margin_left, margin_top, margin_right, margin_bottom;
INIT_MINMAX2(patch_min, patch_max);
minmax_v2v2_v2(patch_min, patch_max, libmv_marker->patch[0]);
minmax_v2v2_v2(patch_min, patch_max, libmv_marker->patch[1]);
minmax_v2v2_v2(patch_min, patch_max, libmv_marker->patch[2]);
minmax_v2v2_v2(patch_min, patch_max, libmv_marker->patch[3]);
minmax_v2v2_v2(patch_min, patch_max, libmv_marker.patch[0]);
minmax_v2v2_v2(patch_min, patch_max, libmv_marker.patch[1]);
minmax_v2v2_v2(patch_min, patch_max, libmv_marker.patch[2]);
minmax_v2v2_v2(patch_min, patch_max, libmv_marker.patch[3]);
margin_left = max_ff(libmv_marker->center[0] - patch_min[0], margin);
margin_top = max_ff(patch_max[1] - libmv_marker->center[1], margin);
margin_right = max_ff(patch_max[0] - libmv_marker->center[0], margin);
margin_bottom = max_ff(libmv_marker->center[1] - patch_min[1], margin);
margin_left = max_ff(libmv_marker.center[0] - patch_min[0], margin);
margin_top = max_ff(patch_max[1] - libmv_marker.center[1], margin);
margin_right = max_ff(patch_max[0] - libmv_marker.center[0], margin);
margin_bottom = max_ff(libmv_marker.center[1] - patch_min[1], margin);
if (libmv_marker->center[0] < margin_left ||
libmv_marker->center[0] > frame_width - margin_right ||
libmv_marker->center[1] < margin_bottom ||
libmv_marker->center[1] > frame_height - margin_top)
if (libmv_marker.center[0] < margin_left ||
libmv_marker.center[0] > frame_width - margin_right ||
libmv_marker.center[1] < margin_bottom || libmv_marker.center[1] > frame_height - margin_top)
{
return false;
}
@ -315,9 +318,9 @@ static bool tracking_check_marker_margin(const libmv_Marker *libmv_marker,
/** \name Auto-Track Context Initialization
* \{ */
static bool autotrack_is_marker_usable(const MovieTrackingMarker *marker)
static bool autotrack_is_marker_usable(const MovieTrackingMarker &marker)
{
if (marker->flag & MARKER_DISABLED) {
if (marker.flag & MARKER_DISABLED) {
return false;
}
return true;
@ -334,7 +337,7 @@ static bool autotrack_is_track_trackable(const AutoTrackContext *context,
clip, context->start_scene_frame);
const MovieTrackingMarker *marker = BKE_tracking_marker_get(track, clip_frame_number);
return autotrack_is_marker_usable(marker);
return autotrack_is_marker_usable(*marker);
}
return false;
}
@ -430,7 +433,7 @@ static size_t autotrack_count_all_usable_markers(AutoTrackContext *context)
for (int track_index = 0; track_index < context->num_all_tracks; ++track_index) {
const MovieTrackingTrack *track = context->all_autotrack_tracks[track_index].track;
for (int marker_index = 0; marker_index < track->markersnr; ++marker_index) {
const MovieTrackingMarker *marker = &track->markers[marker_index];
const MovieTrackingMarker &marker = track->markers[marker_index];
if (!autotrack_is_marker_usable(marker)) {
continue;
}
@ -475,21 +478,21 @@ static void autotrack_context_init_autotrack(AutoTrackContext *context)
int num_filled_libmv_markers = 0;
for (int track_index = 0; track_index < context->num_all_tracks; ++track_index) {
const AutoTrackTrack *autotrack_track = &context->all_autotrack_tracks[track_index];
/*const*/ MovieTrackingTrack *track = autotrack_track->track;
for (int marker_index = 0; marker_index < track->markersnr; ++marker_index) {
/*const*/ MovieTrackingMarker *marker = &track->markers[marker_index];
/*const*/ MovieTrackingTrack &track = *autotrack_track->track;
for (int marker_index = 0; marker_index < track.markersnr; ++marker_index) {
/*const*/ MovieTrackingMarker &marker = track.markers[marker_index];
if (!autotrack_is_marker_usable(marker)) {
continue;
}
const AutoTrackClip *autotrack_clip = &context->autotrack_clips[autotrack_track->clip_index];
dna_marker_to_libmv_marker(track,
marker,
autotrack_track->clip_index,
track_index,
autotrack_clip->width,
autotrack_clip->height,
context->is_backwards,
&libmv_markers[num_filled_libmv_markers++]);
libmv_markers[num_filled_libmv_markers++] = dna_marker_to_libmv_marker(
track,
marker,
autotrack_track->clip_index,
track_index,
autotrack_clip->width,
autotrack_clip->height,
context->is_backwards);
}
}
@ -525,18 +528,17 @@ static void autotrack_context_init_markers(AutoTrackContext *context)
const int clip_frame_number = BKE_movieclip_remap_scene_to_clip_frame(
clip, context->start_scene_frame);
/*const*/ MovieTrackingTrack *track = context->all_autotrack_tracks[track_index].track;
const MovieTrackingMarker *marker = BKE_tracking_marker_get(track, clip_frame_number);
/*const*/ MovieTrackingTrack &track = *context->all_autotrack_tracks[track_index].track;
const MovieTrackingMarker &marker = *BKE_tracking_marker_get(&track, clip_frame_number);
AutoTrackMarker *autotrack_marker = &context->autotrack_markers[autotrack_marker_index++];
dna_marker_to_libmv_marker(track,
marker,
autotrack_track->clip_index,
track_index,
autotrack_clip->width,
autotrack_clip->height,
context->is_backwards,
&autotrack_marker->libmv_marker);
autotrack_marker->libmv_marker = dna_marker_to_libmv_marker(track,
marker,
autotrack_track->clip_index,
track_index,
autotrack_clip->width,
autotrack_clip->height,
context->is_backwards);
}
}
@ -633,35 +635,35 @@ static void autotrack_context_step_cb(void *__restrict userdata,
AutoTrackContext *context = static_cast<AutoTrackContext *>(userdata);
AutoTrackTLS *autotrack_tls = (AutoTrackTLS *)tls->userdata_chunk;
const AutoTrackMarker *autotrack_marker = &context->autotrack_markers[marker_index];
const libmv_Marker *libmv_current_marker = &autotrack_marker->libmv_marker;
const AutoTrackMarker &autotrack_marker = context->autotrack_markers[marker_index];
const libmv_Marker &libmv_current_marker = autotrack_marker.libmv_marker;
const int frame_delta = context->is_backwards ? -1 : 1;
const int clip_index = libmv_current_marker->clip;
const int track_index = libmv_current_marker->track;
const int clip_index = libmv_current_marker.clip;
const int track_index = libmv_current_marker.track;
const AutoTrackClip *autotrack_clip = &context->autotrack_clips[clip_index];
const AutoTrackTrack *autotrack_track = &context->all_autotrack_tracks[track_index];
const MovieTrackingTrack *track = autotrack_track->track;
const AutoTrackClip &autotrack_clip = context->autotrack_clips[clip_index];
const AutoTrackTrack &autotrack_track = context->all_autotrack_tracks[track_index];
const MovieTrackingTrack &track = *autotrack_track.track;
/* Check whether marker is going outside of allowed frame margin. */
if (!tracking_check_marker_margin(
libmv_current_marker, track->margin, autotrack_clip->width, autotrack_clip->height))
libmv_current_marker, track.margin, autotrack_clip.width, autotrack_clip.height))
{
return;
}
const int new_marker_frame = libmv_current_marker->frame + frame_delta;
const int new_marker_frame = libmv_current_marker.frame + frame_delta;
AutoTrackTrackingResult *autotrack_result = MEM_cnew<AutoTrackTrackingResult>(
"autotrack result");
autotrack_result->libmv_marker = *libmv_current_marker;
autotrack_result->libmv_marker = libmv_current_marker;
autotrack_result->libmv_marker.frame = new_marker_frame;
/* Update reference frame. */
libmv_Marker libmv_reference_marker;
if (track->pattern_match == TRACK_MATCH_KEYFRAME) {
autotrack_result->libmv_marker.reference_frame = libmv_current_marker->reference_frame;
if (track.pattern_match == TRACK_MATCH_KEYFRAME) {
autotrack_result->libmv_marker.reference_frame = libmv_current_marker.reference_frame;
libmv_autoTrackGetMarker(context->autotrack,
clip_index,
autotrack_result->libmv_marker.reference_frame,
@ -669,14 +671,14 @@ static void autotrack_context_step_cb(void *__restrict userdata,
&libmv_reference_marker);
}
else {
BLI_assert(track->pattern_match == TRACK_MATCH_PREVIOUS_FRAME);
autotrack_result->libmv_marker.reference_frame = libmv_current_marker->frame;
libmv_reference_marker = *libmv_current_marker;
BLI_assert(track.pattern_match == TRACK_MATCH_PREVIOUS_FRAME);
autotrack_result->libmv_marker.reference_frame = libmv_current_marker.frame;
libmv_reference_marker = libmv_current_marker;
}
/* Perform actual tracking. */
autotrack_result->success = libmv_autoTrackMarker(context->autotrack,
&autotrack_track->track_region_options,
&autotrack_track.track_region_options,
&autotrack_result->libmv_marker,
&autotrack_result->libmv_result);
@ -684,7 +686,7 @@ static void autotrack_context_step_cb(void *__restrict userdata,
* This is how Blender side is currently expecting failed track to be handled. Without this the
* marker is left in an arbitrary position which did not provide good correlation. */
if (!autotrack_result->success) {
autotrack_result->libmv_marker = *libmv_current_marker;
autotrack_result->libmv_marker = libmv_current_marker;
autotrack_result->libmv_marker.frame = new_marker_frame;
}
@ -768,22 +770,21 @@ void BKE_autotrack_context_sync(AutoTrackContext *context)
BLI_spin_unlock(&context->spin_lock);
LISTBASE_FOREACH_MUTABLE (AutoTrackTrackingResult *, autotrack_result, &results_to_sync) {
const libmv_Marker *libmv_marker = &autotrack_result->libmv_marker;
const int clip_index = libmv_marker->clip;
const int track_index = libmv_marker->track;
const AutoTrackClip *autotrack_clip = &context->autotrack_clips[clip_index];
const MovieClip *clip = autotrack_clip->clip;
const AutoTrackTrack *autotrack_track = &context->all_autotrack_tracks[track_index];
MovieTrackingTrack *track = autotrack_track->track;
const libmv_Marker &libmv_marker = autotrack_result->libmv_marker;
const int clip_index = libmv_marker.clip;
const int track_index = libmv_marker.track;
const AutoTrackClip &autotrack_clip = context->autotrack_clips[clip_index];
const MovieClip *clip = autotrack_clip.clip;
const AutoTrackTrack &autotrack_track = context->all_autotrack_tracks[track_index];
MovieTrackingTrack *track = autotrack_track.track;
const int start_clip_frame = BKE_movieclip_remap_scene_to_clip_frame(
clip, context->start_scene_frame);
const int first_result_frame = start_clip_frame + frame_delta;
/* Insert marker which corresponds to the tracking result. */
MovieTrackingMarker marker;
libmv_marker_to_dna_marker(
&autotrack_result->libmv_marker, autotrack_clip->width, autotrack_clip->height, &marker);
MovieTrackingMarker marker = libmv_marker_to_dna_marker(
autotrack_result->libmv_marker, autotrack_clip.width, autotrack_clip.height);
if (!autotrack_result->success) {
marker.flag |= MARKER_DISABLED;
}

View File

@ -109,6 +109,8 @@ class AssetList : NonCopyable {
AssetList(AssetList &&other) = default;
~AssetList() = default;
static bool listen(const wmNotifier &notifier);
void setup();
void fetch(const bContext &C);
void ensurePreviewsJob(const bContext *C);
@ -120,7 +122,6 @@ class AssetList : NonCopyable {
bool isLoaded() const;
asset_system::AssetLibrary *asset_library() const;
void iterate(AssetListIterFn fn) const;
static bool listen(const wmNotifier &notifier);
int size() const;
void tagMainDataDirty() const;
void remapID(ID *id_old, ID *id_new) const;