[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