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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to