diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-11-05 02:31:32 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-11-05 02:31:32 +0400 |
commit | 2ba840652de83e0f546baaf0e10836bd6571731f (patch) | |
tree | 904321ea5fdfed97c02718236eb7645552e82bc0 /intern/cycles/kernel/svm/svm_closure.h | |
parent | 110a36a8ab4cf688e6f2b6ec7398f8473a4896b9 (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.h | 20 |
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; |