[Bf-blender-cvs] [a5732a1de48] temp-udim-images: Automatically find and load all UDIM tiles even if only the 1001 tile is selected

Lukas Stockner noreply at git.blender.org
Sun Jun 10 22:44:27 CEST 2018


Commit: a5732a1de4824ad72871dbd24a1b2b7c6cd02f32
Author: Lukas Stockner
Date:   Sun Jun 10 22:43:30 2018 +0200
Branches: temp-udim-images
https://developer.blender.org/rBa5732a1de4824ad72871dbd24a1b2b7c6cd02f32

Automatically find and load all UDIM tiles even if only the 1001 tile is selected

===================================================================

M	source/blender/editors/space_image/image_ops.c

===================================================================

diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 95cc719ff26..e1a4dcfe7ab 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -45,6 +45,8 @@
 #include "BLI_blenlib.h"
 #include "BLI_utildefines.h"
 #include "BLI_string_utf8.h"
+#include "BLI_fileops.h"
+#include "BLI_fileops_types.h"
 
 #include "BLT_translation.h"
 
@@ -1151,6 +1153,50 @@ static int image_cmp_frame(const void *a, const void *b)
 	return 0;
 }
 
+static int image_get_udim(const char *filepath)
+{
+	if (strstr(filepath, "1001") == NULL) {
+		return 0;
+	}
+
+	char filename[FILE_MAX], dirname[FILE_MAXDIR];
+	BLI_split_dirfile(filepath, dirname, filename, sizeof(dirname), sizeof(filename));
+
+	bool is_udim = true;
+	int max_udim = 0;
+
+	unsigned short digits;
+	char base_head[FILE_MAX], base_tail[FILE_MAX];
+	int id = BLI_stringdec(filename, base_head, base_tail, &digits);
+	if (id == 1001) {
+		struct direntry *dir;
+		uint totfile = BLI_filelist_dir_contents(dirname, &dir);
+		for (int i = 0; i < totfile; i++) {
+			if (!(dir[i].type & S_IFREG)) {
+				continue;
+			}
+			char head[FILE_MAX], tail[FILE_MAX];
+			id = BLI_stringdec(dir[i].relname, head, tail, &digits);
+
+			if (digits > 4 ||
+				!(STREQLEN(base_head, head, FILE_MAX)) ||
+				!(STREQLEN(base_tail, tail, FILE_MAX))) {
+				continue;
+			}
+
+			if (id < 1001 || id >= 2000) {
+				is_udim = false;
+				break;
+			}
+			max_udim = max_ii(max_udim, id);
+		}
+
+		BLI_filelist_free(dir, totfile);
+	}
+
+	return is_udim? (max_udim - 1001) : 0;
+}
+
 /**
  * Return the start (offset) and the length of the sequence of continuous frames in the list of frames
  *
@@ -1158,21 +1204,27 @@ static int image_cmp_frame(const void *a, const void *b)
  * \param ofs: [out] offset the first frame number in the sequence.
  * \return the number of contiguous frames in the sequence
  */
-static int image_sequence_get_len(ListBase *frames, int *ofs)
+static int image_sequence_get_len(ImageFrameRange *frame_range, int *ofs, bool do_udim)
 {
 	ImageFrame *frame;
 
-	BLI_listbase_sort(frames, image_cmp_frame);
+	BLI_listbase_sort(&frame_range->frames, image_cmp_frame);
 
-	frame = frames->first;
+	frame = frame_range->frames.first;
 	if (frame) {
 		int frame_curr = frame->framenr;
 		(*ofs) = frame_curr;
-		while (frame && (frame->framenr == frame_curr)) {
-			frame_curr++;
-			frame = frame->next;
+
+		if (do_udim && (frame_curr == 1001)) {
+			return 1 + image_get_udim(frame_range->filepath);
+		}
+		else {
+			while (frame && (frame->framenr == frame_curr)) {
+				frame_curr++;
+				frame = frame->next;
+			}
+			return frame_curr - (*ofs);
 		}
-		return frame_curr - (*ofs);
 	}
 	*ofs = 0;
 	return 0;
@@ -1246,6 +1298,7 @@ static int image_open_exec(bContext *C, wmOperator *op)
 
 	const bool is_relative_path = RNA_boolean_get(op->ptr, "relative_path");
 	const bool use_multiview    = RNA_boolean_get(op->ptr, "use_multiview");
+	const bool use_udim         = RNA_boolean_get(op->ptr, "use_udim");
 
 	if (!op->customdata)
 		image_open_init(C, op);
@@ -1262,7 +1315,7 @@ static int image_open_exec(bContext *C, wmOperator *op)
 		image_sequence_get_frame_ranges(op->ptr, &frame_ranges_all);
 		for (ImageFrameRange *frame_range = frame_ranges_all.first; frame_range; frame_range = frame_range->next) {
 			int frame_range_ofs;
-			int frame_range_seq_len = image_sequence_get_len(&frame_range->frames, &frame_range_ofs);
+			int frame_range_seq_len = image_sequence_get_len(frame_range, &frame_range_ofs, use_udim);
 			BLI_freelistN(&frame_range->frames);
 
 			char filepath_range[FILE_MAX];
@@ -1286,10 +1339,14 @@ static int image_open_exec(bContext *C, wmOperator *op)
 		BLI_freelistN(&frame_ranges_all);
 	}
 	else {
+		int sequence_len = 1;
+		if (use_udim) {
+			sequence_len = image_get_udim(filepath);
+		}
 		/* for drag & drop etc. */
 		ima = image_open_single(
 		        op, filepath, BKE_main_blendfile_path(bmain),
-		        is_relative_path, use_multiview, 1, 0);
+		        is_relative_path, use_multiview, 1, sequence_len);
 	}
 
 	if (ima == NULL) {
@@ -1472,6 +1529,7 @@ void IMAGE_OT_open(wmOperatorType *ot)
 
 	RNA_def_boolean(ot->srna, "use_sequence_detection", true, "Detect Sequences",
 	                "Automatically detect animated sequences in selected images (based on file names)");
+	RNA_def_boolean(ot->srna, "use_udim", true, "Detect UDIMs", "Detect selected UDIM files and load all matching tiles");
 }
 
 /******************** Match movie length operator ********************/



More information about the Bf-blender-cvs mailing list