[Bf-blender-cvs] [8d16dc029e6] master: Fix T72474: UDIM breaks box mapping in Cycles
Lukas Stockner
noreply at git.blender.org
Mon Dec 16 12:58:31 CET 2019
Commit: 8d16dc029e6c52b16666b4edfafa66794d64b1a4
Author: Lukas Stockner
Date: Mon Dec 16 12:53:03 2019 +0100
Branches: master
https://developer.blender.org/rB8d16dc029e6c52b16666b4edfafa66794d64b1a4
Fix T72474: UDIM breaks box mapping in Cycles
The ImageTextureNode incorrectly used the tile slot encoding for box-
mapped textures as well. Since box-mapping always generates UVs that
lie in the 1001 tile, there's no need to support tiles here.
===================================================================
M intern/cycles/render/nodes.cpp
===================================================================
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index cd990393823..5af22e0c2c3 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -293,6 +293,14 @@ ShaderNode *ImageTextureNode::clone() const
void ImageTextureNode::cull_tiles(Scene *scene, ShaderGraph *graph)
{
+ /* Box projection computes its own UVs that always lie in the
+ * 1001 tile, so there's no point in loading any others. */
+ if (projection == NODE_IMAGE_PROJ_BOX) {
+ tiles.clear();
+ tiles.push_back(1001);
+ return;
+ }
+
if (!scene->params.background) {
/* During interactive renders, all tiles are loaded.
* While we could support updating this when UVs change, that could lead
@@ -408,15 +416,6 @@ void ImageTextureNode::compile(SVMCompiler &compiler)
}
if (has_image) {
- /* If there only is one image (a very common case), we encode it as a negative value. */
- int num_nodes;
- if (slots.size() == 1) {
- num_nodes = -slots[0];
- }
- else {
- num_nodes = divide_up(slots.size(), 2);
- }
-
int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
uint flags = 0;
@@ -434,6 +433,15 @@ void ImageTextureNode::compile(SVMCompiler &compiler)
}
if (projection != NODE_IMAGE_PROJ_BOX) {
+ /* If there only is one image (a very common case), we encode it as a negative value. */
+ int num_nodes;
+ if (slots.size() == 1) {
+ num_nodes = -slots[0];
+ }
+ else {
+ num_nodes = divide_up(slots.size(), 2);
+ }
+
compiler.add_node(NODE_TEX_IMAGE,
num_nodes,
compiler.encode_uchar4(vector_offset,
@@ -441,10 +449,28 @@ void ImageTextureNode::compile(SVMCompiler &compiler)
compiler.stack_assign_if_linked(alpha_out),
flags),
projection);
+
+ if (num_nodes > 0) {
+ for (int i = 0; i < num_nodes; i++) {
+ int4 node;
+ 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);
+ }
+ }
}
else {
+ assert(slots.size() == 1);
compiler.add_node(NODE_TEX_IMAGE_BOX,
- num_nodes,
+ slots[0],
compiler.encode_uchar4(vector_offset,
compiler.stack_assign_if_linked(color_out),
compiler.stack_assign_if_linked(alpha_out),
@@ -452,23 +478,6 @@ void ImageTextureNode::compile(SVMCompiler &compiler)
__float_as_int(projection_blend));
}
- if (num_nodes > 0) {
- for (int i = 0; i < num_nodes; i++) {
- int4 node;
- 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);
- }
- }
-
tex_mapping.compile_end(compiler, vector_in, vector_offset);
}
else {
More information about the Bf-blender-cvs
mailing list