Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2012-11-05 02:31:32 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-11-05 02:31:32 +0400
commit2ba840652de83e0f546baaf0e10836bd6571731f (patch)
tree904321ea5fdfed97c02718236eb7645552e82bc0 /intern/cycles/kernel/svm/svm_geometry.h
parent110a36a8ab4cf688e6f2b6ec7398f8473a4896b9 (diff)
Cycles: improve Anisotropic BSDF node, changing the Roughness U/V inputs to
Roughness, Anisotropy and Rotation. Also a fix for automatic tangents and OSL attribute handling. Meaning of new sockets explained in the documentation: http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Nodes/Shaders#Anisotropic
Diffstat (limited to 'intern/cycles/kernel/svm/svm_geometry.h')
-rw-r--r--intern/cycles/kernel/svm/svm_geometry.h47
1 files changed, 17 insertions, 30 deletions
diff --git a/intern/cycles/kernel/svm/svm_geometry.h b/intern/cycles/kernel/svm/svm_geometry.h
index 501fed95002..8e772f849c7 100644
--- a/intern/cycles/kernel/svm/svm_geometry.h
+++ b/intern/cycles/kernel/svm/svm_geometry.h
@@ -20,22 +20,6 @@ CCL_NAMESPACE_BEGIN
/* Geometry Node */
-__device_inline float3 svm_tangent_from_generated(float3 P)
-{
- float length = len(P);
-
- if(length == 0.0f)
- return make_float3(0.0f, 0.0f, 0.0f);
-
- float u = 0.0f;
- if(!(P.x == 0.0f && P.y == 0.0f))
- u = (1.0f - atan2f(P.x, P.y))/(2.0f*M_PI_F);
-
- float v = 1.0f - acosf(clamp(P.z/length, -1.0f, 1.0f))/M_PI_F;
-
- return make_float3(u, v, 0.0f);
-}
-
__device void svm_node_geometry(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
{
float3 data;
@@ -45,27 +29,30 @@ __device void svm_node_geometry(KernelGlobals *kg, ShaderData *sd, float *stack,
case NODE_GEOM_N: data = sd->N; break;
#ifdef __DPDU__
case NODE_GEOM_T: {
- if(sd->object != ~0) {
- int attr_offset = find_attribute(kg, sd, ATTR_STD_TANGENT);
+ /* first try to get tangent attribute */
+ int attr_offset = (sd->object != ~0)? find_attribute(kg, sd, ATTR_STD_TANGENT): ATTR_STD_NOT_FOUND;
+
+ if(attr_offset != ATTR_STD_NOT_FOUND) {
+ /* ensure orthogonal and normalized (interpolation breaks it) */
+ data = triangle_attribute_float3(kg, sd, ATTR_ELEMENT_CORNER, attr_offset, NULL, NULL);
+ object_normal_transform(kg, sd, &data);
+ data = cross(sd->N, normalize(cross(data, sd->N)));;
+ }
+ else {
+ /* try to create spherical tangent from generated coordinates */
+ int attr_offset = (sd->object != ~0)? find_attribute(kg, sd, ATTR_STD_GENERATED): ATTR_STD_NOT_FOUND;
if(attr_offset != ATTR_STD_NOT_FOUND) {
- data = triangle_attribute_float3(kg, sd, ATTR_ELEMENT_CORNER, attr_offset, NULL, NULL);
+ data = triangle_attribute_float3(kg, sd, ATTR_ELEMENT_VERTEX, attr_offset, NULL, NULL);
+ data = make_float3(-(data.y - 0.5), (data.x - 0.5), 0.0f);
object_normal_transform(kg, sd, &data);
+ data = cross(sd->N, normalize(cross(data, sd->N)));;
}
else {
- attr_offset = find_attribute(kg, sd, ATTR_STD_GENERATED);
-
- if(attr_offset != ATTR_STD_NOT_FOUND) {
- data = triangle_attribute_float3(kg, sd, ATTR_ELEMENT_VERTEX, attr_offset, NULL, NULL);
- svm_tangent_from_generated(data);
- object_normal_transform(kg, sd, &data);
- }
- else
- data = normalize(sd->dPdu);
+ /* otherwise use surface derivatives */
+ data = normalize(sd->dPdu);
}
}
- else
- data = normalize(sd->dPdu);
break;
}