Cycles: Fix for bump node not working with object texture mapping
This was intended to be in the original patch of texco copy from object.
This commit is contained in:
@@ -399,10 +399,10 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, Shade
|
||||
break;
|
||||
#ifdef __EXTRA_NODES__
|
||||
case NODE_TEX_COORD_BUMP_DX:
|
||||
svm_node_tex_coord_bump_dx(kg, sd, path_flag, stack, node.y, node.z);
|
||||
svm_node_tex_coord_bump_dx(kg, sd, path_flag, stack, node, &offset);
|
||||
break;
|
||||
case NODE_TEX_COORD_BUMP_DY:
|
||||
svm_node_tex_coord_bump_dy(kg, sd, path_flag, stack, node.y, node.z);
|
||||
svm_node_tex_coord_bump_dy(kg, sd, path_flag, stack, node, &offset);
|
||||
break;
|
||||
case NODE_CLOSURE_SET_NORMAL:
|
||||
svm_node_set_normal(kg, sd, stack, node.y, node.z );
|
||||
|
@@ -99,16 +99,34 @@ ccl_device void svm_node_tex_coord(KernelGlobals *kg,
|
||||
stack_store_float3(stack, out_offset, data);
|
||||
}
|
||||
|
||||
ccl_device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, int path_flag, float *stack, uint type, uint out_offset)
|
||||
ccl_device void svm_node_tex_coord_bump_dx(KernelGlobals *kg,
|
||||
ShaderData *sd,
|
||||
int path_flag,
|
||||
float *stack,
|
||||
uint4 node,
|
||||
int *offset)
|
||||
{
|
||||
#ifdef __RAY_DIFFERENTIALS__
|
||||
float3 data;
|
||||
uint type = node.y;
|
||||
uint out_offset = node.z;
|
||||
|
||||
switch(type) {
|
||||
case NODE_TEXCO_OBJECT: {
|
||||
data = sd->P + sd->dP.dx;
|
||||
if(sd->object != OBJECT_NONE)
|
||||
object_inverse_position_transform(kg, sd, &data);
|
||||
if(node.w == 0) {
|
||||
if(sd->object != OBJECT_NONE) {
|
||||
object_inverse_position_transform(kg, sd, &data);
|
||||
}
|
||||
}
|
||||
else {
|
||||
Transform tfm;
|
||||
tfm.x = read_node_float(kg, offset);
|
||||
tfm.y = read_node_float(kg, offset);
|
||||
tfm.z = read_node_float(kg, offset);
|
||||
tfm.w = read_node_float(kg, offset);
|
||||
data = transform_point(&tfm, data);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NODE_TEXCO_NORMAL: {
|
||||
@@ -162,20 +180,38 @@ ccl_device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, in
|
||||
|
||||
stack_store_float3(stack, out_offset, data);
|
||||
#else
|
||||
svm_node_tex_coord(kg, sd, stack, type, out_offset);
|
||||
svm_node_tex_coord(kg, sd, path_flag, stack, node, offset);
|
||||
#endif
|
||||
}
|
||||
|
||||
ccl_device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, int path_flag, float *stack, uint type, uint out_offset)
|
||||
ccl_device void svm_node_tex_coord_bump_dy(KernelGlobals *kg,
|
||||
ShaderData *sd,
|
||||
int path_flag,
|
||||
float *stack,
|
||||
uint4 node,
|
||||
int *offset)
|
||||
{
|
||||
#ifdef __RAY_DIFFERENTIALS__
|
||||
float3 data;
|
||||
uint type = node.y;
|
||||
uint out_offset = node.z;
|
||||
|
||||
switch(type) {
|
||||
case NODE_TEXCO_OBJECT: {
|
||||
data = sd->P + sd->dP.dy;
|
||||
if(sd->object != OBJECT_NONE)
|
||||
object_inverse_position_transform(kg, sd, &data);
|
||||
if(node.w == 0) {
|
||||
if(sd->object != OBJECT_NONE) {
|
||||
object_inverse_position_transform(kg, sd, &data);
|
||||
}
|
||||
}
|
||||
else {
|
||||
Transform tfm;
|
||||
tfm.x = read_node_float(kg, offset);
|
||||
tfm.y = read_node_float(kg, offset);
|
||||
tfm.z = read_node_float(kg, offset);
|
||||
tfm.w = read_node_float(kg, offset);
|
||||
data = transform_point(&tfm, data);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NODE_TEXCO_NORMAL: {
|
||||
@@ -229,7 +265,7 @@ ccl_device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, in
|
||||
|
||||
stack_store_float3(stack, out_offset, data);
|
||||
#else
|
||||
svm_node_tex_coord(kg, sd, stack, type, out_offset);
|
||||
svm_node_tex_coord(kg, sd, path_flag, stack, node, offset);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user