[Bf-blender-cvs] [c383935a720] temp-udim-images: UDIM Refactor: Store tiles in a linked list, access by position instead of index

Lukas Stockner noreply at git.blender.org
Fri Jun 15 18:44:49 CEST 2018


Commit: c383935a720b31017c5b74210b0234da64ee1307
Author: Lukas Stockner
Date:   Fri Jun 15 17:52:42 2018 +0200
Branches: temp-udim-images
https://developer.blender.org/rBc383935a720b31017c5b74210b0234da64ee1307

UDIM Refactor: Store tiles in a linked list, access by position instead of index

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

M	intern/cycles/blender/blender_shader.cpp
M	intern/cycles/kernel/svm/svm_image.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h
M	release/scripts/startup/bl_ui/space_image.py
M	source/blender/blenkernel/BKE_image.h
M	source/blender/blenkernel/intern/image.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/compositor/operations/COM_ViewerOperation.cpp
M	source/blender/editors/object/object_bake_api.c
M	source/blender/editors/render/render_preview.c
M	source/blender/editors/sculpt_paint/paint_image_2d.c
M	source/blender/editors/space_image/image_draw.c
M	source/blender/editors/space_image/image_ops.c
M	source/blender/gpu/intern/gpu_draw.c
M	source/blender/makesdna/DNA_image_types.h
M	source/blender/makesrna/intern/rna_image.c
M	source/blender/makesrna/intern/rna_image_api.c
M	source/blender/makesrna/intern/rna_space.c
M	source/blender/nodes/shader/nodes/node_shader_tex_image.c

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

diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index c3582fafbeb..b8bb22f4152 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -658,7 +658,12 @@ 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();
+
+			image->tiles.clear();
+			BL::Image::tiles_iterator b_iter;
+			for(b_image.tiles.begin(b_iter); b_iter != b_image.tiles.end(); ++b_iter) {
+				image->tiles.push_back(b_iter->tile_number());
+			}
 
 			/* TODO: restore */
 			/* TODO(sergey): Does not work properly when we change builtin type. */
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index 509beeba438..8edc42e2828 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -70,39 +70,37 @@ ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, float *sta
 		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(node.y > 0) {
+		uint num_nodes = node.y;
+		int next_offset = (*offset) + num_nodes;
 		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;
+			for(int i = 0; i < num_nodes; i++) {
+				uint4 node = read_node(kg, offset);
+				if(node.x == tile) {
+					id = node.y;
+					break;
+				}
+				if(node.z == tile) {
+					id = node.w;
+					break;
 				}
+			}
 
+			if(id != -1) {
 				tex_co.x -= tx;
 				tex_co.y -= ty;
 			}
 		}
+		*offset = next_offset;
 	}
 	else {
-		id = read_node(kg, offset).x;
+		id = read_node(kg, offset).y;
 	}
 
-	*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/nodes.cpp b/intern/cycles/render/nodes.cpp
index 9a63dd4f82d..ebf957685d6 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -253,7 +253,7 @@ ImageTextureNode::ImageTextureNode()
 	is_linear = false;
 	builtin_data = NULL;
 	animated = false;
-	num_tiles = 1;
+	tiles.push_back(0);
 }
 
 ImageTextureNode::~ImageTextureNode()
@@ -297,26 +297,26 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
 	ShaderOutput *alpha_out = output("Alpha");
 
 	image_manager = compiler.image_manager;
-	if(slots.size() < num_tiles) {
-		slots.resize(num_tiles);
-		for(int tile = 0; tile < num_tiles; tile++) {
+	if(slots.size() < tiles.size()) {
+		slots.clear();
+		foreach(int tile, tiles) {
 			string tile_name;
-			if(num_tiles == 1) {
+			if(tiles.size() == 1) {
 				tile_name = filename.string();
 			}
 			else {
 				tile_name = string_printf(filename.c_str(), 1001 + tile);
 			}
 			ImageMetaData metadata;
-			slots[tile] = image_manager->add_image(tile_name,
-			                                       builtin_data,
-			                                       animated,
-			                                       tile,
-			                                       0,
-			                                       interpolation,
-			                                       extension,
-			                                       use_alpha,
-			                                       metadata);
+			slots.push_back(image_manager->add_image(tile_name,
+			                                         builtin_data,
+			                                         animated,
+			                                         tile,
+			                                         0,
+			                                         interpolation,
+			                                         extension,
+			                                         use_alpha,
+			                                         metadata));
 			if(tile == 0) {
 				is_float = metadata.is_float;
 				is_linear = metadata.is_linear;
@@ -333,6 +333,7 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
 	}
 
 	if(has_image) {
+		int num_nodes = divide_up(slots.size(), 2);
 		int srgb = (is_linear || color_space != NODE_COLOR_SPACE_COLOR)? 0: 1;
 		int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
 
@@ -340,7 +341,7 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
 
 		if(projection != NODE_IMAGE_PROJ_BOX) {
 			compiler.add_node(NODE_TEX_IMAGE,
-				slots.size(),
+				num_nodes,
 				compiler.encode_uchar4(
 					vector_offset,
 					compiler.stack_assign_if_linked(color_out),
@@ -350,7 +351,7 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
 		}
 		else {
 			compiler.add_node(NODE_TEX_IMAGE_BOX,
-				slots.size(),
+				num_nodes,
 				compiler.encode_uchar4(
 					vector_offset,
 					compiler.stack_assign_if_linked(color_out),
@@ -359,11 +360,17 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
 				__float_as_int(projection_blend));
 		}
 
-		for(int i = 0; i < divide_up(slots.size(), 4); i++) {
+		for(int i = 0; i < num_nodes; i++) {
 			int4 node;
-			for(int j = 0; j < 4; j++) {
-				int idx = 4*i + j;
-				node[j] = (idx < slots.size())? slots[idx] : -1;
+			node.x = tiles[2*i];
+			node.y = slots[2*i];
+			if(2*i+1 < slots.size()) {
+				node.z = tiles[2*i+1];
+				node.w = slots[2*i+1];
+			}
+			else {
+				node.z = -1;
+				node.w = -1;
 			}
 			compiler.add_node(node.x, node.y, node.z, node.w);
 		}
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index 5a07b5fea4c..5744331b3ce 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -98,7 +98,7 @@ public:
 	float projection_blend;
 	bool animated;
 	float3 vector;
-	int num_tiles;
+	ccl::vector<int> tiles;
 
 	virtual bool equals(const ShaderNode& other)
 	{
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index b13debde1cc..67331967919 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -782,9 +782,10 @@ class IMAGE_PT_tile_properties(Panel):
         row.operator("image.remove_tile")
 
         layout.prop(sima, "current_tile")
-        tile = ima.tiles[sima.current_tile]
-        layout.prop(tile, "label")
-        layout.operator("image.generate_tile")
+        tile = ima.tiles.get(sima.current_tile)
+        if tile:
+            layout.prop(tile, "label")
+            layout.operator("image.generate_tile")
 
 
 class IMAGE_PT_tools_transform_uvs(Panel, UVToolsPanel):
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 969a1af7b37..59f5f003e9b 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -45,6 +45,7 @@ struct Scene;
 struct Object;
 struct ImageFormatData;
 struct ImagePool;
+struct ImageTile;
 struct Main;
 struct ReportList;
 struct RenderResult;
@@ -275,17 +276,15 @@ bool BKE_image_has_alpha(struct Image *image);
 bool BKE_image_has_opengl_texture(struct Image *ima);
 
 /* get tile index for tiled images */
-int BKE_image_get_tile_index(struct Image *ima, struct ImageUser *iuser);
-void BKE_image_get_tile_label(struct Image *ima, int tile, char *label, int len_label);
+void BKE_image_get_tile_label(struct Image *ima, struct ImageTile *tile, char *label, int len_label);
 
-struct ImageTile *BKE_image_add_tile(struct Image *ima, const char *label);
-bool BKE_image_remove_tile(struct Image *ima);
-bool BKE_image_make_tiled(struct Image *ima, int num_tiles);
+struct ImageTile *BKE_image_add_tile(struct Image *ima, int tile_number, const char *label);
+bool BKE_image_remove_tile(struct Image *ima, struct ImageTile *tile);
 
-bool BKE_image_generate_tile(struct Image *ima, int tile, int width, int height, const float color[4], int gen_type);
+bool BKE_image_generate_tile(struct Image *ima, struct ImageTile *tile, int width, int height, const float color[4], int gen_type);
 
-struct GPUTexture *BKE_image_get_gpu_texture(struct Image *ima, int tile, int type);
-void BKE_image_set_gpu_texture(struct Image *ima, int tile, int type, struct GPUTexture *tex);
+struct ImageTile *BKE_image_get_tile(struct Image *ima, int tile_number);
+struct ImageTile *BKE_image_get_tile_from_iuser(struct Image *ima, struct ImageUser *iuser);
 
 int BKE_image_get_tile_from_pos(struct Image *ima, const float uv[2], float new_uv[2], float ofs[2]);
 
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index f2cff2d1dfb..9c4d03ced8a 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -338,8 +338,8 @@ void BKE_image_free_buffers_ex(Image *ima, bool do_lock)
 		GPU_free_image(ima);
 	}
 
-	for (int i = 0; i < ima->num_tiles; i++) {
-		ima->tiles[i].ok = IMA_OK;
+	LISTBASE_FOREACH(ImageTile*, tile, &ima->tiles) {
+		tile->ok = IMA_OK;
 	}
 
 	if (do_lock) {
@@ -374,7 +374,7 @@ void BKE_image_free(Image *ima)
 	BKE_icon_id_delete(&ima->id);
 	BKE_previewimg_free(&ima->preview);
 
-	MEM_freeN(ima->tiles);
+	BLI_freelistN(&ima->tiles);
 }
 
 /* only image block itself */
@@ -392,9 +392,9 @@ static void image_init(Image *ima, short source, short type)
 	if (source == IMA_SRC_VIEWER)
 		ima->flag |= IMA_VIEW_AS_RENDER;
 
-	ima->num_tiles = 1;
-	ima->tiles = MEM_callocN(sizeof(ImageTile), "Image Tiles");
-	ima->tiles[0].ok = IMA_OK;
+	ImageTile *tile = MEM_callocN(sizeof(ImageTile), "Image Tiles");
+	tile->ok = IMA_OK;
+	BLI_addtail(&ima->tiles, tile);
 
 	if (type == IMA_TYPE_R_RESULT) {
 		for (int i = 0; i < 8; i++) {
@@ -502,9 +502,10 @@ void BKE_image_copy_data(Main *UNUSED(bmain), Image *ima_dst, const Image *ima_s
 	}
 
 	BLI_listbase_clear(&ima_dst->anims);
-	for (int i = 0; i < ima_dst->num_tiles; i++) {
+	BLI_dupl

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list