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_closure.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_closure.h')
-rw-r--r--intern/cycles/kernel/svm/svm_closure.h20
1 files changed, 18 insertions, 2 deletions
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index b72fad26a1f..11ce3b7c5d1 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -211,8 +211,24 @@ __device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *st
sc->T = stack_load_float3(stack, data_node.z);
svm_node_closure_set_mix_weight(sc, mix_weight);
- sc->data0 = param1;
- sc->data1 = param2;
+ /* rotate tangent */
+ float rotation = stack_load_float(stack, data_node.w);
+
+ if(rotation != 0.0f)
+ sc->T = rotate_around_axis(sc->T, sc->N, rotation * 2.0f * M_PI_F);
+
+ /* compute roughness */
+ float roughness = param1;
+ float anisotropy = clamp(param2, -0.99f, 0.99f);
+
+ if(anisotropy < 0.0f) {
+ sc->data0 = roughness*(1.0f + anisotropy);
+ sc->data1 = roughness/(1.0f + anisotropy);
+ }
+ else {
+ sc->data0 = roughness/(1.0f - anisotropy);
+ sc->data1 = roughness*(1.0f - anisotropy);
+ }
sd->flag |= bsdf_ward_setup(sc);
break;