[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