Merge remote-tracking branch 'origin/blender-v3.2-release'
This commit is contained in:
commit
138a4846e2
|
@ -370,6 +370,11 @@ typedef enum {
|
|||
UDIM_TILE_FORMAT_UVTILE = 2
|
||||
} eUDIM_TILE_FORMAT;
|
||||
|
||||
/**
|
||||
* Checks if the filename portion of the path contains a UDIM token.
|
||||
*/
|
||||
bool BKE_image_is_filename_tokenized(char *filepath);
|
||||
|
||||
/**
|
||||
* Ensures that `filename` contains a UDIM token if we find a supported format pattern.
|
||||
* \note This must only be the name component (without slashes).
|
||||
|
|
|
@ -2929,6 +2929,7 @@ void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
|
|||
MEM_freeN(tile);
|
||||
}
|
||||
base_tile->next = nullptr;
|
||||
base_tile->tile_number = 1001;
|
||||
ima->tiles.last = base_tile;
|
||||
}
|
||||
|
||||
|
@ -3111,7 +3112,9 @@ bool BKE_image_get_tile_info(char *filepath, ListBase *tiles, int *r_tile_start,
|
|||
char filename[FILE_MAXFILE], dirname[FILE_MAXDIR];
|
||||
BLI_split_dirfile(filepath, dirname, filename, sizeof(dirname), sizeof(filename));
|
||||
|
||||
BKE_image_ensure_tile_token(filename);
|
||||
if (!BKE_image_is_filename_tokenized(filename)) {
|
||||
BKE_image_ensure_tile_token(filename);
|
||||
}
|
||||
|
||||
eUDIM_TILE_FORMAT tile_format;
|
||||
char *udim_pattern = BKE_image_get_tile_strformat(filename, &tile_format);
|
||||
|
@ -3145,10 +3148,7 @@ bool BKE_image_get_tile_info(char *filepath, ListBase *tiles, int *r_tile_start,
|
|||
BLI_filelist_free(dirs, dirs_num);
|
||||
MEM_SAFE_FREE(udim_pattern);
|
||||
|
||||
/* Ensure that all discovered UDIMs are valid and that there's at least 2 files in total.
|
||||
* Downstream code checks the range value to determine tiled-ness; it's important we match that
|
||||
* expectation here too (T97366). */
|
||||
if (all_valid_udim && min_udim <= IMA_UDIM_MAX && max_udim > min_udim) {
|
||||
if (all_valid_udim && min_udim <= IMA_UDIM_MAX) {
|
||||
BLI_join_dirfile(filepath, FILE_MAX, dirname, filename);
|
||||
|
||||
*r_tile_start = min_udim;
|
||||
|
@ -3315,13 +3315,18 @@ bool BKE_image_fill_tile(struct Image *ima,
|
|||
return false;
|
||||
}
|
||||
|
||||
bool BKE_image_is_filename_tokenized(char *filepath)
|
||||
{
|
||||
const char *filename = BLI_path_basename(filepath);
|
||||
return strstr(filename, "<UDIM>") != nullptr || strstr(filename, "<UVTILE>") != nullptr;
|
||||
}
|
||||
|
||||
void BKE_image_ensure_tile_token(char *filename)
|
||||
{
|
||||
BLI_assert_msg(BLI_path_slash_find(filename) == nullptr,
|
||||
"Only the file-name component should be used!");
|
||||
|
||||
/* Is there a '<' character in the filename? Assume tokens already present. */
|
||||
if (strstr(filename, "<") != nullptr) {
|
||||
if (BKE_image_is_filename_tokenized(filename)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -173,6 +173,7 @@ typedef struct ImageFrameRange {
|
|||
int length;
|
||||
int offset;
|
||||
/* UDIM tiles. */
|
||||
bool udims_detected;
|
||||
ListBase udim_tiles;
|
||||
|
||||
/* Temporary data. */
|
||||
|
|
|
@ -1274,8 +1274,8 @@ static Image *image_open_single(Main *bmain,
|
|||
BKE_image_free_views(ima);
|
||||
}
|
||||
|
||||
if ((range->length > 1) && (ima->source == IMA_SRC_FILE)) {
|
||||
if (range->udim_tiles.first) {
|
||||
if (ima->source == IMA_SRC_FILE) {
|
||||
if (range->udims_detected && range->udim_tiles.first) {
|
||||
ima->source = IMA_SRC_TILED;
|
||||
ImageTile *first_tile = ima->tiles.first;
|
||||
first_tile->tile_number = range->offset;
|
||||
|
@ -1283,7 +1283,7 @@ static Image *image_open_single(Main *bmain,
|
|||
BKE_image_add_tile(ima, POINTER_AS_INT(node->data), NULL);
|
||||
}
|
||||
}
|
||||
else {
|
||||
else if (range->length > 1) {
|
||||
ima->source = IMA_SRC_SEQUENCE;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -107,10 +107,10 @@ static void image_detect_frame_range(ImageFrameRange *range, const bool detect_u
|
|||
/* UDIM */
|
||||
if (detect_udim) {
|
||||
int udim_start, udim_range;
|
||||
bool result = BKE_image_get_tile_info(
|
||||
range->udims_detected = BKE_image_get_tile_info(
|
||||
range->filepath, &range->udim_tiles, &udim_start, &udim_range);
|
||||
|
||||
if (result) {
|
||||
if (range->udims_detected) {
|
||||
range->offset = udim_start;
|
||||
range->length = udim_range;
|
||||
return;
|
||||
|
|
Loading…
Reference in New Issue