diff options
Diffstat (limited to 'intern/cycles/kernel/svm')
-rw-r--r-- | intern/cycles/kernel/svm/svm.h | 9 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_bump.h | 54 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_image.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_tex_coord.h | 12 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_types.h | 10 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_voxel.h | 2 |
6 files changed, 85 insertions, 4 deletions
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h index 502994e71f1..9ca8917d327 100644 --- a/intern/cycles/kernel/svm/svm.h +++ b/intern/cycles/kernel/svm/svm.h @@ -181,6 +181,7 @@ CCL_NAMESPACE_END #include "svm_brick.h" #include "svm_vector_transform.h" #include "svm_voxel.h" +#include "svm_bump.h" CCL_NAMESPACE_BEGIN @@ -294,6 +295,14 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a case NODE_CLOSURE_SET_NORMAL: svm_node_set_normal(kg, sd, stack, node.y, node.z); break; +# if NODES_FEATURE(NODE_FEATURE_BUMP_STATE) + case NODE_ENTER_BUMP_EVAL: + svm_node_enter_bump_eval(kg, sd, stack, node.y); + break; + case NODE_LEAVE_BUMP_EVAL: + svm_node_leave_bump_eval(kg, sd, stack, node.y); + break; +# endif /* NODES_FEATURE(NODE_FEATURE_BUMP_STATE) */ # endif /* NODES_FEATURE(NODE_FEATURE_BUMP) */ case NODE_HSV: svm_node_hsv(kg, sd, stack, node, &offset); diff --git a/intern/cycles/kernel/svm/svm_bump.h b/intern/cycles/kernel/svm/svm_bump.h new file mode 100644 index 00000000000..04a8c7b64e5 --- /dev/null +++ b/intern/cycles/kernel/svm/svm_bump.h @@ -0,0 +1,54 @@ +/* + * Copyright 2011-2016 Blender Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +CCL_NAMESPACE_BEGIN + +/* Bump Eval Nodes */ + +ccl_device void svm_node_enter_bump_eval(KernelGlobals *kg, ShaderData *sd, float *stack, uint offset) +{ + /* save state */ + stack_store_float3(stack, offset+0, ccl_fetch(sd, P)); + stack_store_float3(stack, offset+3, ccl_fetch(sd, dP).dx); + stack_store_float3(stack, offset+6, ccl_fetch(sd, dP).dy); + + /* set state as if undisplaced */ + const AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_POSITION_UNDISPLACED); + + if(desc.offset != ATTR_STD_NOT_FOUND) { + float3 P, dPdx, dPdy; + P = primitive_attribute_float3(kg, sd, desc, &dPdx, &dPdy); + + object_position_transform(kg, sd, &P); + object_dir_transform(kg, sd, &dPdx); + object_dir_transform(kg, sd, &dPdy); + + ccl_fetch(sd, P) = P; + ccl_fetch(sd, dP).dx = dPdx; + ccl_fetch(sd, dP).dy = dPdy; + } +} + +ccl_device void svm_node_leave_bump_eval(KernelGlobals *kg, ShaderData *sd, float *stack, uint offset) +{ + /* restore state */ + ccl_fetch(sd, P) = stack_load_float3(stack, offset+0); + ccl_fetch(sd, dP).dx = stack_load_float3(stack, offset+3); + ccl_fetch(sd, dP).dy = stack_load_float3(stack, offset+6); +} + +CCL_NAMESPACE_END + diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h index 5d02be1fa2f..378ce650129 100644 --- a/intern/cycles/kernel/svm/svm_image.h +++ b/intern/cycles/kernel/svm/svm_image.h @@ -296,7 +296,7 @@ ccl_device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y, /* float, byte and half */ else { float f = kernel_tex_image_interp_float(tex, x, y); - r = make_float4(f, f, f, 1.0); + r = make_float4(f, f, f, 1.0f); } # endif #endif diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h index 01dede3fff5..6ea2539c543 100644 --- a/intern/cycles/kernel/svm/svm_tex_coord.h +++ b/intern/cycles/kernel/svm/svm_tex_coord.h @@ -277,6 +277,7 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st float3 color = stack_load_float3(stack, color_offset); color = 2.0f*make_float3(color.x - 0.5f, color.y - 0.5f, color.z - 0.5f); + bool is_backfacing = (ccl_fetch(sd, flag) & SD_BACKFACING) != 0; float3 N; if(space == NODE_NORMAL_MAP_TANGENT) { @@ -306,6 +307,12 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st } else { normal = ccl_fetch(sd, Ng); + + /* the normal is already inverted, which is too soon for the math here */ + if(is_backfacing) { + normal = -normal; + } + object_inverse_normal_transform(kg, sd, &normal); } @@ -332,6 +339,11 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st N = safe_normalize(N); } + /* invert normal for backfacing polygons */ + if(is_backfacing) { + N = -N; + } + float strength = stack_load_float(stack, strength_offset); if(strength != 1.0f) { diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index 51083c31708..5adf7d34f7f 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -26,6 +26,8 @@ CCL_NAMESPACE_BEGIN /* SVM stack offsets with this value indicate that it's not on the stack */ #define SVM_STACK_INVALID 255 +#define SVM_BUMP_EVAL_STATE_SIZE 9 + /* Nodes */ /* Known frequencies of used nodes, used for selective nodes compilation @@ -45,11 +47,12 @@ CCL_NAMESPACE_BEGIN #define NODE_FEATURE_VOLUME (1 << 0) #define NODE_FEATURE_HAIR (1 << 1) #define NODE_FEATURE_BUMP (1 << 2) +#define NODE_FEATURE_BUMP_STATE (1 << 3) /* TODO(sergey): Consider using something like ((uint)(-1)). * Need to check carefully operand types around usage of this * define first. */ -#define NODE_FEATURE_ALL (NODE_FEATURE_VOLUME|NODE_FEATURE_HAIR|NODE_FEATURE_BUMP) +#define NODE_FEATURE_ALL (NODE_FEATURE_VOLUME|NODE_FEATURE_HAIR|NODE_FEATURE_BUMP|NODE_FEATURE_BUMP_STATE) typedef enum ShaderNodeType { NODE_END = 0, @@ -127,6 +130,8 @@ typedef enum ShaderNodeType { NODE_HAIR_INFO, NODE_UVMAP, NODE_TEX_VOXEL, + NODE_ENTER_BUMP_EVAL, + NODE_LEAVE_BUMP_EVAL, } ShaderNodeType; typedef enum NodeAttributeType { @@ -374,7 +379,8 @@ typedef enum NodeTexVoxelSpace { typedef enum ShaderType { SHADER_TYPE_SURFACE, SHADER_TYPE_VOLUME, - SHADER_TYPE_DISPLACEMENT + SHADER_TYPE_DISPLACEMENT, + SHADER_TYPE_BUMP, } ShaderType; /* Closure */ diff --git a/intern/cycles/kernel/svm/svm_voxel.h b/intern/cycles/kernel/svm/svm_voxel.h index d2cc2c3730e..f54f4e8e888 100644 --- a/intern/cycles/kernel/svm/svm_voxel.h +++ b/intern/cycles/kernel/svm/svm_voxel.h @@ -50,7 +50,7 @@ ccl_device void svm_node_tex_voxel(KernelGlobals *kg, r = kernel_tex_image_interp_3d_float4(tex, co.x, co.y, co.z); else { float f = kernel_tex_image_interp_3d_float(tex, co.x, co.y, co.z); - r = make_float4(f, f, f, 1.0); + r = make_float4(f, f, f, 1.0f); } # else /* __CUDA_ARCH__ >= 300 */ r = volume_image_texture_3d(id, co.x, co.y, co.z); |