Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/svm/svm_displace.h
| Show First 20 Lines • Show All 131 Lines • ▼ Show 20 Lines | ccl_device void svm_node_vector_displacement(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) | ||||
| if(space == NODE_NORMAL_MAP_TANGENT) { | if(space == NODE_NORMAL_MAP_TANGENT) { | ||||
| /* Tangent space. */ | /* Tangent space. */ | ||||
| float3 normal = sd->N; | float3 normal = sd->N; | ||||
| object_inverse_normal_transform(kg, sd, &normal); | object_inverse_normal_transform(kg, sd, &normal); | ||||
| const AttributeDescriptor attr = find_attribute(kg, sd, node.z); | const AttributeDescriptor attr = find_attribute(kg, sd, node.z); | ||||
| float3 tangent; | float3 tangent; | ||||
| if(attr.offset != ATTR_STD_NOT_FOUND) { | if(attr.offset != ATTR_STD_NOT_FOUND) { | ||||
| tangent = primitive_attribute_float3(kg, sd, attr, NULL, NULL); | tangent = primitive_surface_attribute_float3(kg, sd, attr, NULL, NULL); | ||||
| } | } | ||||
| else { | else { | ||||
| tangent = normalize(sd->dPdu); | tangent = normalize(sd->dPdu); | ||||
| } | } | ||||
| float3 bitangent = normalize(cross(normal, tangent)); | float3 bitangent = normalize(cross(normal, tangent)); | ||||
| const AttributeDescriptor attr_sign = find_attribute(kg, sd, node.w); | const AttributeDescriptor attr_sign = find_attribute(kg, sd, node.w); | ||||
| if(attr_sign.offset != ATTR_STD_NOT_FOUND) { | if(attr_sign.offset != ATTR_STD_NOT_FOUND) { | ||||
| float sign = primitive_attribute_float(kg, sd, attr_sign, NULL, NULL); | float sign = primitive_surface_attribute_float(kg, sd, attr_sign, NULL, NULL); | ||||
| bitangent *= sign; | bitangent *= sign; | ||||
| } | } | ||||
| dP = tangent*dP.x + normal*dP.y + bitangent*dP.z; | dP = tangent*dP.x + normal*dP.y + bitangent*dP.z; | ||||
| } | } | ||||
| if(space != NODE_NORMAL_MAP_WORLD) { | if(space != NODE_NORMAL_MAP_WORLD) { | ||||
| /* Tangent or object space. */ | /* Tangent or object space. */ | ||||
| object_dir_transform(kg, sd, &dP); | object_dir_transform(kg, sd, &dP); | ||||
| } | } | ||||
| stack_store_float3(stack, displacement_offset, dP); | stack_store_float3(stack, displacement_offset, dP); | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||