Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/svm/svm_tex_coord.h
| Show First 20 Lines • Show All 271 Lines • ▼ Show 20 Lines | |||||
| ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node) | ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node) | ||||
| { | { | ||||
| uint color_offset, strength_offset, normal_offset, space; | uint color_offset, strength_offset, normal_offset, space; | ||||
| decode_node_uchar4(node.y, &color_offset, &strength_offset, &normal_offset, &space); | decode_node_uchar4(node.y, &color_offset, &strength_offset, &normal_offset, &space); | ||||
| float3 color = stack_load_float3(stack, color_offset); | 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); | 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; | |||||
brecht: Use `(ccl_fetch(sd, flag) & SD_BACKFACING) == 0` in case `SD_BACKFACING` doesn't fit in `bool`. | |||||
| float3 N; | float3 N; | ||||
| if(space == NODE_NORMAL_MAP_TANGENT) { | if(space == NODE_NORMAL_MAP_TANGENT) { | ||||
| /* tangent space */ | /* tangent space */ | ||||
| if(ccl_fetch(sd, object) == OBJECT_NONE) { | if(ccl_fetch(sd, object) == OBJECT_NONE) { | ||||
| stack_store_float3(stack, normal_offset, make_float3(0.0f, 0.0f, 0.0f)); | stack_store_float3(stack, normal_offset, make_float3(0.0f, 0.0f, 0.0f)); | ||||
| return; | return; | ||||
| } | } | ||||
| Show All 13 Lines | if(space == NODE_NORMAL_MAP_TANGENT) { | ||||
| float sign = primitive_attribute_float(kg, sd, attr_sign, NULL, NULL); | float sign = primitive_attribute_float(kg, sd, attr_sign, NULL, NULL); | ||||
| float3 normal; | float3 normal; | ||||
| if(ccl_fetch(sd, shader) & SHADER_SMOOTH_NORMAL) { | if(ccl_fetch(sd, shader) & SHADER_SMOOTH_NORMAL) { | ||||
| normal = primitive_attribute_float3(kg, sd, attr_normal, NULL, NULL); | normal = primitive_attribute_float3(kg, sd, attr_normal, NULL, NULL); | ||||
| } | } | ||||
| else { | else { | ||||
| normal = ccl_fetch(sd, Ng); | normal = ccl_fetch(sd, Ng); | ||||
| /* the normal is already inverted, which is too soon here */ | |||||
| if(is_backfacing) { | |||||
| normal = -normal; | |||||
| } | |||||
| object_inverse_normal_transform(kg, sd, &normal); | object_inverse_normal_transform(kg, sd, &normal); | ||||
| } | } | ||||
| /* apply normal map */ | /* apply normal map */ | ||||
| float3 B = sign * cross(normal, tangent); | float3 B = sign * cross(normal, tangent); | ||||
| N = safe_normalize(color.x * tangent + color.y * B + color.z * normal); | N = safe_normalize(color.x * tangent + color.y * B + color.z * normal); | ||||
| /* transform to world space */ | /* transform to world space */ | ||||
| Show All 10 Lines | else { | ||||
| N = color; | N = color; | ||||
| if(space == NODE_NORMAL_MAP_OBJECT || space == NODE_NORMAL_MAP_BLENDER_OBJECT) | if(space == NODE_NORMAL_MAP_OBJECT || space == NODE_NORMAL_MAP_BLENDER_OBJECT) | ||||
| object_normal_transform(kg, sd, &N); | object_normal_transform(kg, sd, &N); | ||||
| else | else | ||||
| N = safe_normalize(N); | N = safe_normalize(N); | ||||
| } | } | ||||
| /* invert normal for backfacing polygons */ | |||||
| if(is_backfacing) { | |||||
| N = -N; | |||||
| } | |||||
| float strength = stack_load_float(stack, strength_offset); | float strength = stack_load_float(stack, strength_offset); | ||||
| if(strength != 1.0f) { | if(strength != 1.0f) { | ||||
| strength = max(strength, 0.0f); | strength = max(strength, 0.0f); | ||||
| N = safe_normalize(ccl_fetch(sd, N) + (N - ccl_fetch(sd, N))*strength); | N = safe_normalize(ccl_fetch(sd, N) + (N - ccl_fetch(sd, N))*strength); | ||||
| } | } | ||||
| if(is_zero(N)) { | if(is_zero(N)) { | ||||
| ▲ Show 20 Lines • Show All 47 Lines • Show Last 20 Lines | |||||
Use (ccl_fetch(sd, flag) & SD_BACKFACING) == 0 in case SD_BACKFACING doesn't fit in bool. It does now but best to be safe.