[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51267] trunk/blender: Cycles: per-BSDF normal input and new Bump node.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Oct 10 17:56:43 CEST 2012


Revision: 51267
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51267
Author:   blendix
Date:     2012-10-10 15:56:43 +0000 (Wed, 10 Oct 2012)
Log Message:
-----------
Cycles: per-BSDF normal input and new Bump node.

Each BSDF node now has a Normal input, which can be used to set a custom normal
for the BSDF, for example if you want to have only bump on one of the layers in
a multilayer material.

The Bump node can be used to generate a normal from a scalar value, the same as
what happens when you connect a scalar value to the displacement output.

Documentation has been updated with the latest changes:
http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Nodes

Patch by Agustin Benavidez, some implementation tweaks by me.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_diffuse.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_microfacet.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_oren_nayar.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_reflection.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_refraction.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_ward.h
    trunk/blender/intern/cycles/kernel/svm/bsdf_westin.h
    trunk/blender/intern/cycles/kernel/svm/svm.h
    trunk/blender/intern/cycles/kernel/svm/svm_closure.h
    trunk/blender/intern/cycles/kernel/svm/svm_displace.h
    trunk/blender/intern/cycles/kernel/svm/svm_types.h
    trunk/blender/intern/cycles/render/graph.cpp
    trunk/blender/intern/cycles/render/graph.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/nodes.h
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree_types.h
    trunk/blender/source/blender/nodes/CMakeLists.txt
    trunk/blender/source/blender/nodes/NOD_shader.h
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_bsdf_anisotropic.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_bsdf_velvet.c

Added Paths:
-----------
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_bump.c

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-10-10 14:28:47 UTC (rev 51266)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2012-10-10 15:56:43 UTC (rev 51267)
@@ -402,6 +402,10 @@
 			node = new ParticleInfoNode();
 			break;
 		}
+		case BL::ShaderNode::type_BUMP: {
+			node = new BumpNode();
+			break;
+		}
 		case BL::ShaderNode::type_TEX_IMAGE: {
 			BL::ShaderNodeTexImage b_image_node(b_node);
 			BL::Image b_image(b_image_node.image());

Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h	2012-10-10 14:28:47 UTC (rev 51266)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h	2012-10-10 15:56:43 UTC (rev 51267)
@@ -370,6 +370,7 @@
 #endif
 	float data0;
 	float data1;
+	float3 N;
 
 } ShaderClosure;
 

Modified: trunk/blender/intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h	2012-10-10 14:28:47 UTC (rev 51266)
+++ trunk/blender/intern/cycles/kernel/svm/bsdf_ashikhmin_velvet.h	2012-10-10 15:56:43 UTC (rev 51267)
@@ -58,7 +58,7 @@
 __device float3 bsdf_ashikhmin_velvet_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
 {
 	float m_invsigma2 = sc->data0;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	float cosNO = dot(m_N, I);
 	float cosNI = dot(m_N, omega_in);
@@ -106,7 +106,7 @@
 __device int bsdf_ashikhmin_velvet_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
 {
 	float m_invsigma2 = sc->data0;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	// we are viewing the surface from above - send a ray out with uniform
 	// distribution over the hemisphere

Modified: trunk/blender/intern/cycles/kernel/svm/bsdf_diffuse.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/bsdf_diffuse.h	2012-10-10 14:28:47 UTC (rev 51266)
+++ trunk/blender/intern/cycles/kernel/svm/bsdf_diffuse.h	2012-10-10 15:56:43 UTC (rev 51267)
@@ -53,7 +53,7 @@
 
 __device float3 bsdf_diffuse_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
 {
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	float cos_pi = fmaxf(dot(m_N, omega_in), 0.0f) * M_1_PI_F;
 	*pdf = cos_pi;
@@ -72,7 +72,7 @@
 
 __device int bsdf_diffuse_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
 {
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	// distribution over the hemisphere
 	sample_cos_hemisphere(m_N, randu, randv, omega_in, pdf);
@@ -116,7 +116,7 @@
 
 __device float3 bsdf_translucent_eval_transmit(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
 {
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	float cos_pi = fmaxf(-dot(m_N, omega_in), 0.0f) * M_1_PI_F;
 	*pdf = cos_pi;
@@ -130,7 +130,7 @@
 
 __device int bsdf_translucent_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
 {
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	// we are viewing the surface from the right side - send a ray out with cosine
 	// distribution over the hemisphere

Modified: trunk/blender/intern/cycles/kernel/svm/bsdf_microfacet.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/bsdf_microfacet.h	2012-10-10 14:28:47 UTC (rev 51266)
+++ trunk/blender/intern/cycles/kernel/svm/bsdf_microfacet.h	2012-10-10 15:56:43 UTC (rev 51267)
@@ -76,7 +76,7 @@
 	float m_ag = sc->data0;
 	//float m_eta = sc->data1;
 	int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	if(m_refractive) return make_float3 (0, 0, 0);
 	float cosNO = dot(m_N, I);
@@ -113,7 +113,7 @@
 	float m_ag = sc->data0;
 	float m_eta = sc->data1;
 	int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	if(!m_refractive) return make_float3 (0, 0, 0);
 	float cosNO = dot(m_N, I);
@@ -154,7 +154,7 @@
 	float m_ag = sc->data0;
 	float m_eta = sc->data1;
 	int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	float cosNO = dot(m_N, sd->I);
 	if(cosNO > 0) {
@@ -302,7 +302,7 @@
 	float m_ab = sc->data0;
 	//float m_eta = sc->data1;
 	int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	if(m_refractive) return make_float3 (0, 0, 0);
 	float cosNO = dot(m_N, I);
@@ -341,7 +341,7 @@
 	float m_ab = sc->data0;
 	float m_eta = sc->data1;
 	int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	if(!m_refractive) return make_float3 (0, 0, 0);
 	float cosNO = dot(m_N, I);
@@ -384,7 +384,7 @@
 	float m_ab = sc->data0;
 	float m_eta = sc->data1;
 	int m_refractive = sc->type == CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	float cosNO = dot(m_N, sd->I);
 	if(cosNO > 0) {

Modified: trunk/blender/intern/cycles/kernel/svm/bsdf_oren_nayar.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/bsdf_oren_nayar.h	2012-10-10 14:28:47 UTC (rev 51266)
+++ trunk/blender/intern/cycles/kernel/svm/bsdf_oren_nayar.h	2012-10-10 15:56:43 UTC (rev 51267)
@@ -57,9 +57,9 @@
 
 __device float3 bsdf_oren_nayar_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
 {
-	if (dot(sd->N, omega_in) > 0.0f) {
+	if (dot(sc->N, omega_in) > 0.0f) {
 		*pdf = 0.5f * M_1_PI_F;
-		return bsdf_oren_nayar_get_intensity(sc, sd->N, I, omega_in);
+		return bsdf_oren_nayar_get_intensity(sc, sc->N, I, omega_in);
 	}
 	else {
 		*pdf = 0.0f;
@@ -79,15 +79,15 @@
 
 __device int bsdf_oren_nayar_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
 {
-	sample_uniform_hemisphere(sd->N, randu, randv, omega_in, pdf);
+	sample_uniform_hemisphere(sc->N, randu, randv, omega_in, pdf);
 
 	if (dot(sd->Ng, *omega_in) > 0.0f) {
-		*eval = bsdf_oren_nayar_get_intensity(sc, sd->N, sd->I, *omega_in);
+		*eval = bsdf_oren_nayar_get_intensity(sc, sc->N, sd->I, *omega_in);
 
 #ifdef __RAY_DIFFERENTIALS__
 		// TODO: find a better approximation for the bounce
-		*domega_in_dx = (2.0f * dot(sd->N, sd->dI.dx)) * sd->N - sd->dI.dx;
-		*domega_in_dy = (2.0f * dot(sd->N, sd->dI.dy)) * sd->N - sd->dI.dy;
+		*domega_in_dx = (2.0f * dot(sc->N, sd->dI.dx)) * sc->N - sd->dI.dx;
+		*domega_in_dy = (2.0f * dot(sc->N, sd->dI.dy)) * sc->N - sd->dI.dy;
 		*domega_in_dx *= 125.0f;
 		*domega_in_dy *= 125.0f;
 #endif

Modified: trunk/blender/intern/cycles/kernel/svm/bsdf_reflection.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/bsdf_reflection.h	2012-10-10 14:28:47 UTC (rev 51266)
+++ trunk/blender/intern/cycles/kernel/svm/bsdf_reflection.h	2012-10-10 15:56:43 UTC (rev 51267)
@@ -69,7 +69,7 @@
 __device int bsdf_reflection_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
 {
 	//const BsdfReflectionClosure *self = (const BsdfReflectionClosure*)sc->data;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	// only one direction is possible
 	float cosNO = dot(m_N, sd->I);

Modified: trunk/blender/intern/cycles/kernel/svm/bsdf_refraction.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/bsdf_refraction.h	2012-10-10 14:28:47 UTC (rev 51266)
+++ trunk/blender/intern/cycles/kernel/svm/bsdf_refraction.h	2012-10-10 15:56:43 UTC (rev 51267)
@@ -71,7 +71,7 @@
 __device int bsdf_refraction_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
 {
 	float m_eta = sc->data0;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	float3 R, T;
 #ifdef __RAY_DIFFERENTIALS__

Modified: trunk/blender/intern/cycles/kernel/svm/bsdf_ward.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/bsdf_ward.h	2012-10-10 14:28:47 UTC (rev 51266)
+++ trunk/blender/intern/cycles/kernel/svm/bsdf_ward.h	2012-10-10 15:56:43 UTC (rev 51267)
@@ -66,7 +66,7 @@
 {
 	float m_ax = sc->data0;
 	float m_ay = sc->data1;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 	float3 m_T = sd->T;
 
 	float cosNO = dot(m_N, I);
@@ -108,7 +108,7 @@
 {
 	float m_ax = sc->data0;
 	float m_ay = sc->data1;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 	float3 m_T = sd->T;
 
 	float cosNO = dot(m_N, sd->I);

Modified: trunk/blender/intern/cycles/kernel/svm/bsdf_westin.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/bsdf_westin.h	2012-10-10 14:28:47 UTC (rev 51266)
+++ trunk/blender/intern/cycles/kernel/svm/bsdf_westin.h	2012-10-10 15:56:43 UTC (rev 51267)
@@ -62,7 +62,7 @@
 __device float3 bsdf_westin_backscatter_eval_reflect(const ShaderData *sd, const ShaderClosure *sc, const float3 I, const float3 omega_in, float *pdf)
 {
 	float m_invroughness = sc->data0;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	// pdf is implicitly 0 (no indirect sampling)
 	float cosNO = dot(m_N, I);
@@ -89,7 +89,7 @@
 __device int bsdf_westin_backscatter_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
 {
 	float m_invroughness = sc->data0;
-	float3 m_N = sd->N;
+	float3 m_N = sc->N;
 
 	float cosNO = dot(m_N, sd->I);
 	if(cosNO > 0) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list