[Bf-blender-cvs] [62550b490ac] temp-udim-images: Add UDIM support to the Cycles Image node

Lukas Stockner noreply at git.blender.org
Mon Jun 11 14:41:13 CEST 2018


Commit: 62550b490ac6373cee341355d906d516eca1ed1a
Author: Lukas Stockner
Date:   Mon Jun 11 14:39:33 2018 +0200
Branches: temp-udim-images
https://developer.blender.org/rB62550b490ac6373cee341355d906d516eca1ed1a

Add UDIM support to the Cycles Image node

SVM only for now, OSL will come later.

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

M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h
M	intern/cycles/blender/blender_shader.cpp
M	intern/cycles/blender/blender_util.h
M	intern/cycles/kernel/svm/svm.h
M	intern/cycles/kernel/svm/svm_image.h
M	intern/cycles/render/image.cpp
M	intern/cycles/render/image.h
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h
M	source/blender/blenkernel/BKE_image.h
M	source/blender/blenkernel/intern/image.c
M	source/blender/makesrna/intern/rna_image.c

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

diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 6fe650f3699..ab5c82ed316 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -348,6 +348,7 @@ static void create_mesh_volume_attribute(BL::Object& b_ob,
 	        Attribute::standard_name(std),
 	        b_ob.ptr.data,
 	        animated,
+	        0,
 	        frame,
 	        INTERPOLATION_LINEAR,
 	        EXTENSION_CLIP,
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 7a9d411b9bb..4b764f017a6 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -138,8 +138,8 @@ void BlenderSession::create_session()
 
 	/* setup callbacks for builtin image support */
 	scene->image_manager->builtin_image_info_cb = function_bind(&BlenderSession::builtin_image_info, this, _1, _2, _3);
-	scene->image_manager->builtin_image_pixels_cb = function_bind(&BlenderSession::builtin_image_pixels, this, _1, _2, _3, _4, _5);
-	scene->image_manager->builtin_image_float_pixels_cb = function_bind(&BlenderSession::builtin_image_float_pixels, this, _1, _2, _3, _4, _5);
+	scene->image_manager->builtin_image_pixels_cb = function_bind(&BlenderSession::builtin_image_pixels, this, _1, _2, _3, _4, _5, _6);
+	scene->image_manager->builtin_image_float_pixels_cb = function_bind(&BlenderSession::builtin_image_float_pixels, this, _1, _2, _3, _4, _5, _6);
 
 	session->scene = scene;
 
@@ -1110,6 +1110,7 @@ void BlenderSession::builtin_image_info(const string &builtin_name,
 
 bool BlenderSession::builtin_image_pixels(const string &builtin_name,
                                           void *builtin_data,
+                                          int tile,
                                           unsigned char *pixels,
                                           const size_t pixels_size,
                                           const bool free_cache)
@@ -1128,7 +1129,7 @@ bool BlenderSession::builtin_image_pixels(const string &builtin_name,
 	const int height = b_image.size()[1];
 	const int channels = b_image.channels();
 
-	unsigned char *image_pixels = image_get_pixels_for_frame(b_image, frame);
+	unsigned char *image_pixels = image_get_pixels_for_frame(b_image, frame, tile);
 	const size_t num_pixels = ((size_t)width) * height;
 
 	if(image_pixels && num_pixels * channels == pixels_size) {
@@ -1173,6 +1174,7 @@ bool BlenderSession::builtin_image_pixels(const string &builtin_name,
 
 bool BlenderSession::builtin_image_float_pixels(const string &builtin_name,
                                                 void *builtin_data,
+                                                int tile,
                                                 float *pixels,
                                                 const size_t pixels_size,
                                                 const bool free_cache)
@@ -1195,7 +1197,7 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name,
 		const int channels = b_image.channels();
 
 		float *image_pixels;
-		image_pixels = image_get_float_pixels_for_frame(b_image, frame);
+		image_pixels = image_get_float_pixels_for_frame(b_image, frame, tile);
 		const size_t num_pixels = ((size_t)width) * height;
 
 		if(image_pixels && num_pixels * channels == pixels_size) {
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index aecb304c270..9937366d814 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -158,11 +158,13 @@ protected:
 	                        ImageMetaData& metadata);
 	bool builtin_image_pixels(const string &builtin_name,
 	                          void *builtin_data,
+	                          int tile,
 	                          unsigned char *pixels,
 	                          const size_t pixels_size,
 	                          const bool free_cache);
 	bool builtin_image_float_pixels(const string &builtin_name,
 	                                void *builtin_data,
+	                                int tile,
 	                                float *pixels,
 	                                const size_t pixels_size,
 	                                const bool free_cache);
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 740416e3a8a..a44b4dd739d 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -658,6 +658,7 @@ static ShaderNode *add_node(Scene *scene,
 
 			image->animated = b_image_node.image_user().use_auto_refresh();
 			image->use_alpha = b_image.use_alpha();
+			image->num_tiles = b_image.num_tiles();
 
 			/* TODO: restore */
 			/* TODO(sergey): Does not work properly when we change builtin type. */
@@ -869,6 +870,7 @@ static ShaderNode *add_node(Scene *scene,
 			scene->image_manager->tag_reload_image(
 			        point_density->filename.string(),
 			        point_density->builtin_data,
+			        0,
 			        point_density->interpolation,
 			        EXTENSION_CLIP,
 			        true);
diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h
index 8a874b7063e..fd92b39eb79 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -34,8 +34,8 @@ extern "C" {
 size_t BLI_timecode_string_from_time_simple(char *str, size_t maxlen, double time_seconds);
 void BKE_image_user_frame_calc(void *iuser, int cfra, int fieldnr);
 void BKE_image_user_file_path(void *iuser, void *ima, char *path);
-unsigned char *BKE_image_get_pixels_for_frame(void *image, int frame);
-float *BKE_image_get_float_pixels_for_frame(void *image, int frame);
+unsigned char *BKE_image_get_pixels_for_frame(void *image, int frame, int tile);
+float *BKE_image_get_float_pixels_for_frame(void *image, int frame, int tile);
 }
 
 CCL_NAMESPACE_BEGIN
@@ -220,8 +220,15 @@ static inline string image_user_file_path(BL::ImageUser& iuser,
                                           int cfra)
 {
 	char filepath[1024];
+	iuser.tile(0);
 	BKE_image_user_frame_calc(iuser.ptr.data, cfra, 0);
 	BKE_image_user_file_path(iuser.ptr.data, ima.ptr.data, filepath);
+	if(ima.source() == BL::Image::source_TILED) {
+		char *udim_id = strstr(filepath, "1001");
+		if(udim_id) {
+			memcpy(udim_id, "%04d", 4);
+		}
+	}
 	return string(filepath);
 }
 
@@ -232,15 +239,15 @@ static inline int image_user_frame_number(BL::ImageUser& iuser, int cfra)
 }
 
 static inline unsigned char *image_get_pixels_for_frame(BL::Image& image,
-                                                        int frame)
+                                                        int frame, int tile)
 {
-	return BKE_image_get_pixels_for_frame(image.ptr.data, frame);
+	return BKE_image_get_pixels_for_frame(image.ptr.data, frame, tile);
 }
 
 static inline float *image_get_float_pixels_for_frame(BL::Image& image,
-                                                      int frame)
+                                                      int frame, int tile)
 {
-	return BKE_image_get_float_pixels_for_frame(image.ptr.data, frame);
+	return BKE_image_get_float_pixels_for_frame(image.ptr.data, frame, tile);
 }
 
 /* Utilities */
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index bfa146f2d93..6d6fbd36e1a 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -276,7 +276,7 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a
 #  endif  /* NODES_FEATURE(NODE_FEATURE_BUMP) */
 #  ifdef __TEXTURES__
 			case NODE_TEX_IMAGE:
-				svm_node_tex_image(kg, sd, stack, node);
+				svm_node_tex_image(kg, sd, stack, node, &offset);
 				break;
 			case NODE_TEX_IMAGE_BOX:
 				svm_node_tex_image_box(kg, sd, stack, node);
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index 4226e7adfe0..4ff892c89ef 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -18,6 +18,9 @@ CCL_NAMESPACE_BEGIN
 
 ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y, uint srgb, uint use_alpha)
 {
+	if(id == -1) {
+		return make_float4(TEX_IMAGE_MISSING_R, TEX_IMAGE_MISSING_G, TEX_IMAGE_MISSING_B, TEX_IMAGE_MISSING_A);
+	}
 	float4 r = kernel_tex_image_interp(kg, id, x, y);
 	const float alpha = r.w;
 
@@ -45,9 +48,8 @@ ccl_device_inline float3 texco_remap_square(float3 co)
 	return (co - make_float3(0.5f, 0.5f, 0.5f)) * 2.0f;
 }
 
-ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
+ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset)
 {
-	uint id = node.y;
 	uint co_offset, out_offset, alpha_offset, srgb;
 
 	decode_node_uchar4(node.z, &co_offset, &out_offset, &alpha_offset, &srgb);
@@ -66,6 +68,40 @@ ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, float *sta
 	else {
 		tex_co = make_float2(co.x, co.y);
 	}
+
+	uint num_nodes = divide_up(node.y, 4);
+	int next_offset = (*offset) + num_nodes;
+
+	int id = -1;
+	if(node.y > 1) {
+		if(tex_co.x >= 0.0f && tex_co.y < 10.0f && tex_co.y >= 0.0f) {
+			int tx = (int) tex_co.x;
+			int ty = (int) tex_co.y;
+			int tile = ty*10 + tx;
+
+			uint num_nodes = divide_up(node.y, 4);
+			if(tile < node.y) {
+				uint node_num = tile/4;
+				(*offset) += node_num;
+				uint4 slot_node = read_node(kg, offset);
+				switch(tile % 4) {
+					case 0: id = slot_node.x; break;
+					case 1: id = slot_node.y; break;
+					case 2: id = slot_node.z; break;
+					case 3: id = slot_node.w; break;
+				}
+
+				tex_co.x -= tx;
+				tex_co.y -= ty;
+			}
+		}
+	}
+	else {
+		id = read_node(kg, offset).x;
+	}
+
+	*offset = next_offset;
+
 	float4 f = svm_image_texture(kg, id, tex_co.x, tex_co.y, srgb, use_alpha);
 
 	if(stack_valid(out_offset))
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 9c5e32e8219..8bb1a58b421 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -242,12 +242,14 @@ string ImageManager::name_from_type(int type)
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list