[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60615] trunk/blender: Cycles / SSS:

Thomas Dinges blender at dingto.org
Tue Oct 8 19:07:18 CEST 2013


Revision: 60615
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60615
Author:   dingto
Date:     2013-10-08 17:07:18 +0000 (Tue, 08 Oct 2013)
Log Message:
-----------
Cycles / SSS:
* Remove the compatible falloff SSS implementation. We shouldn't support two implementations in the long term, and 2.7x is a good release number do break some compatibility as well. 

* Version patch added, so Files with Compatible falloff will automatically use Cubic now. 

It was already mentioned in the manual, that Compatible is deprecated. 
http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Nodes/Shaders#BSSRDF

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    trunk/blender/intern/cycles/kernel/kernel_path.h
    trunk/blender/intern/cycles/kernel/kernel_subsurface.h
    trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
    trunk/blender/intern/cycles/kernel/svm/svm_closure.h
    trunk/blender/intern/cycles/kernel/svm/svm_types.h
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2013-10-08 15:32:54 UTC (rev 60614)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2013-10-08 17:07:18 UTC (rev 60615)
@@ -322,9 +322,6 @@
 		SubsurfaceScatteringNode *subsurface = new SubsurfaceScatteringNode();
 
 		switch(b_subsurface_node.falloff()) {
-		case BL::ShaderNodeSubsurfaceScattering::falloff_COMPATIBLE:
-			subsurface->closure = CLOSURE_BSSRDF_COMPATIBLE_ID;
-			break;
 		case BL::ShaderNodeSubsurfaceScattering::falloff_CUBIC:
 			subsurface->closure = CLOSURE_BSSRDF_CUBIC_ID;
 			break;

Modified: trunk/blender/intern/cycles/kernel/kernel_path.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_path.h	2013-10-08 15:32:54 UTC (rev 60614)
+++ trunk/blender/intern/cycles/kernel/kernel_path.h	2013-10-08 17:07:18 UTC (rev 60615)
@@ -266,14 +266,9 @@
 			if(sc) {
 				uint lcg_state = lcg_init(*rng + rng_offset + sample*0x68bc21eb);
 
-				if(old_subsurface_scatter_use(&sd)) {
-					old_subsurface_scatter_step(kg, &sd, state.flag, sc, &lcg_state, false);
-				}
-				else {
-					float bssrdf_u, bssrdf_v;
-					path_rng_2D(kg, rng, sample, num_total_samples, rng_offset + PRNG_BSDF_U, &bssrdf_u, &bssrdf_v);
-					subsurface_scatter_step(kg, &sd, state.flag, sc, &lcg_state, bssrdf_u, bssrdf_v, false);
-				}
+				float bssrdf_u, bssrdf_v;
+				path_rng_2D(kg, rng, sample, num_total_samples, rng_offset + PRNG_BSDF_U, &bssrdf_u, &bssrdf_v);
+				subsurface_scatter_step(kg, &sd, state.flag, sc, &lcg_state, bssrdf_u, bssrdf_v, false);
 
 				state.flag |= PATH_RAY_BSSRDF_ANCESTOR;
 			}
@@ -664,41 +659,35 @@
 			if(sc) {
 				uint lcg_state = lcg_init(*rng + rng_offset + sample*0x68bc21eb);
 
-				if(old_subsurface_scatter_use(&sd)) {
-					old_subsurface_scatter_step(kg, &sd, state.flag, sc, &lcg_state, false);
-				}
-				else {
-					ShaderData bssrdf_sd[BSSRDF_MAX_HITS];
-					float bssrdf_u, bssrdf_v;
-					path_rng_2D(kg, rng, sample, num_samples, rng_offset + PRNG_BSDF_U, &bssrdf_u, &bssrdf_v);
-					int num_hits = subsurface_scatter_multi_step(kg, &sd, bssrdf_sd, state.flag, sc, &lcg_state, bssrdf_u, bssrdf_v, false);
+				ShaderData bssrdf_sd[BSSRDF_MAX_HITS];
+				float bssrdf_u, bssrdf_v;
+				path_rng_2D(kg, rng, sample, num_samples, rng_offset + PRNG_BSDF_U, &bssrdf_u, &bssrdf_v);
+				int num_hits = subsurface_scatter_multi_step(kg, &sd, bssrdf_sd, state.flag, sc, &lcg_state, bssrdf_u, bssrdf_v, false);
 
-					/* compute lighting with the BSDF closure */
-					for(int hit = 0; hit < num_hits; hit++) {
-						float3 tp = throughput;
-						PathState hit_state = state;
-						Ray hit_ray = ray;
-						float hit_ray_t = ray_t;
-						float hit_ray_pdf = ray_pdf;
-						float hit_min_ray_pdf = min_ray_pdf;
+				/* compute lighting with the BSDF closure */
+				for(int hit = 0; hit < num_hits; hit++) {
+					float3 tp = throughput;
+					PathState hit_state = state;
+					Ray hit_ray = ray;
+					float hit_ray_t = ray_t;
+					float hit_ray_pdf = ray_pdf;
+					float hit_min_ray_pdf = min_ray_pdf;
 
-						hit_state.flag |= PATH_RAY_BSSRDF_ANCESTOR;
-						
-						if(kernel_path_integrate_lighting(kg, rng, sample, num_samples, &bssrdf_sd[hit],
-							&tp, &hit_min_ray_pdf, &hit_ray_pdf, &hit_state, rng_offset+PRNG_BOUNCE_NUM, &L, &hit_ray, &hit_ray_t)) {
-							kernel_path_indirect(kg, rng, sample, hit_ray, buffer,
-								tp, num_samples, num_samples,
-								hit_min_ray_pdf, hit_ray_pdf, hit_state, rng_offset+PRNG_BOUNCE_NUM*2, &L);
+					hit_state.flag |= PATH_RAY_BSSRDF_ANCESTOR;
+					
+					if(kernel_path_integrate_lighting(kg, rng, sample, num_samples, &bssrdf_sd[hit],
+						&tp, &hit_min_ray_pdf, &hit_ray_pdf, &hit_state, rng_offset+PRNG_BOUNCE_NUM, &L, &hit_ray, &hit_ray_t)) {
+						kernel_path_indirect(kg, rng, sample, hit_ray, buffer,
+							tp, num_samples, num_samples,
+							hit_min_ray_pdf, hit_ray_pdf, hit_state, rng_offset+PRNG_BOUNCE_NUM*2, &L);
 
-							/* for render passes, sum and reset indirect light pass variables
-							 * for the next samples */
-							path_radiance_sum_indirect(&L);
-							path_radiance_reset_indirect(&L);
-						}
+						/* for render passes, sum and reset indirect light pass variables
+						 * for the next samples */
+						path_radiance_sum_indirect(&L);
+						path_radiance_reset_indirect(&L);
 					}
-
-					break;
 				}
+				break;
 			}
 		}
 #endif
@@ -1131,17 +1120,6 @@
 				/* do subsurface scatter step with copy of shader data, this will
 				 * replace the BSSRDF with a diffuse BSDF closure */
 				for(int j = 0; j < num_samples; j++) {
-					if(old_subsurface_scatter_use(&sd)) {
-						ShaderData bssrdf_sd = sd;
-						old_subsurface_scatter_step(kg, &bssrdf_sd, state.flag, sc, &lcg_state, true);
-
-						/* compute lighting with the BSDF closure */
-						kernel_branched_path_integrate_lighting(kg, rng, sample*num_samples + j,
-							aa_samples*num_samples,
-							&bssrdf_sd, throughput, num_samples_inv,
-							ray_pdf, ray_pdf, state, rng_offset, &L, buffer);
-					}
-					else {
 						ShaderData bssrdf_sd[BSSRDF_MAX_HITS];
 						float bssrdf_u, bssrdf_v;
 						path_rng_2D(kg, &bssrdf_rng, sample*num_samples + j, aa_samples*num_samples, rng_offset + PRNG_BSDF_U, &bssrdf_u, &bssrdf_v);
@@ -1153,7 +1131,6 @@
 								aa_samples*num_samples,
 								&bssrdf_sd[hit], throughput, num_samples_inv,
 								ray_pdf, ray_pdf, state, rng_offset+PRNG_BOUNCE_NUM, &L, buffer);
-					}
 				}
 
 				state.flag &= ~PATH_RAY_BSSRDF_ANCESTOR;

Modified: trunk/blender/intern/cycles/kernel/kernel_subsurface.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_subsurface.h	2013-10-08 15:32:54 UTC (rev 60614)
+++ trunk/blender/intern/cycles/kernel/kernel_subsurface.h	2013-10-08 17:07:18 UTC (rev 60615)
@@ -403,164 +403,5 @@
 	subsurface_scatter_setup_diffuse_bsdf(sd, eval, (num_hits > 0), N);
 }
 
-
-/* OLD BSSRDF */
-
-__device float old_bssrdf_sample_distance(KernelGlobals *kg, float radius, float refl, float u)
-{
-	int table_offset = kernel_data.bssrdf.table_offset;
-	float r = lookup_table_read_2D(kg, u, refl, table_offset, BSSRDF_RADIUS_TABLE_SIZE, BSSRDF_REFL_TABLE_SIZE);
-
-	return r*radius;
-}
-
-#ifdef BSSRDF_MULTI_EVAL
-__device float old_bssrdf_pdf(KernelGlobals *kg, float radius, float refl, float r)
-{
-	if(r >= radius)
-		return 0.0f;
-
-	/* todo: when we use the real BSSRDF this will need to be divided by the maximum
-	 * radius instead of the average radius */
-	float t = r/radius;
-
-	int table_offset = kernel_data.bssrdf.table_offset + BSSRDF_PDF_TABLE_OFFSET;
-	float pdf = lookup_table_read_2D(kg, t, refl, table_offset, BSSRDF_RADIUS_TABLE_SIZE, BSSRDF_REFL_TABLE_SIZE);
-
-	pdf /= radius;
-
-	return pdf;
-}
-#endif
-
-#ifdef BSSRDF_MULTI_EVAL
-__device float3 old_subsurface_scatter_multi_eval(KernelGlobals *kg, ShaderData *sd, bool hit, float refl, float *r, int num_r, bool all)
-{
-	/* compute pdf */
-	float3 eval_sum = make_float3(0.0f, 0.0f, 0.0f);
-	float pdf_sum = 0.0f;
-	float sample_weight_sum = 0.0f;
-	int num_bssrdf = 0;
-
-	for(int i = 0; i < sd->num_closure; i++) {
-		ShaderClosure *sc = &sd->closure[i];
-		
-		if(CLOSURE_IS_BSSRDF(sc->type)) {
-			float sample_weight = (all)? 1.0f: sc->sample_weight;
-
-			/* compute pdf */
-			float pdf = 1.0f;
-			for(int i = 0; i < num_r; i++)
-				pdf *= old_bssrdf_pdf(kg, sc->data0, refl, r[i]);
-
-			eval_sum += sc->weight*pdf;
-			pdf_sum += sample_weight*pdf;
-
-			sample_weight_sum += sample_weight;
-			num_bssrdf++;
-		}
-	}
-
-	float inv_pdf_sum;
-	
-	if(pdf_sum > 0.0f) {
-		/* in case of branched path integrate we sample all bssrdf's once,
-		 * for path trace we pick one, so adjust pdf for that */
-		if(all)
-			inv_pdf_sum = 1.0f/pdf_sum;
-		else
-			inv_pdf_sum = sample_weight_sum/pdf_sum;
-	}
-	else
-		inv_pdf_sum = 0.0f;
-
-	float3 weight = eval_sum * inv_pdf_sum;
-
-	return weight;
-}
-#endif
-
-/* subsurface scattering step, from a point on the surface to another nearby point on the same object */
-__device void old_subsurface_scatter_step(KernelGlobals *kg, ShaderData *sd, int state_flag, ShaderClosure *sc, uint *lcg_state, bool all)
-{
-	float radius = sc->data0;
-	float refl = max(average(sc->weight)*3.0f, 0.0f);
-	float r = 0.0f;
-	bool hit = false;
-	float3 weight = make_float3(1.0f, 1.0f, 1.0f);
-#ifdef BSSRDF_MULTI_EVAL
-	float r_attempts[BSSRDF_MAX_ATTEMPTS];
-#endif
-	int num_attempts;
-
-	/* attempt to find a hit a given number of times before giving up */
-	for(num_attempts = 0; num_attempts < kernel_data.bssrdf.num_attempts; num_attempts++) {
-		/* random numbers for sampling */
-		float u1 = lcg_step_float(lcg_state);
-		float u2 = lcg_step_float(lcg_state);
-		float u3 = lcg_step_float(lcg_state);
-		float u4 = lcg_step_float(lcg_state);
-		float u5 = lcg_step_float(lcg_state);
-
-		r = old_bssrdf_sample_distance(kg, radius, refl, u5);
-#ifdef BSSRDF_MULTI_EVAL
-		r_attempts[num_attempts] = r;
-#endif
-
-		float3 p1 = sd->P + sample_uniform_sphere(u1, u2)*r;
-		float3 p2 = sd->P + sample_uniform_sphere(u3, u4)*r;
-
-		/* create ray */
-		Ray ray;
-		ray.P = p1;
-		ray.D = normalize_len(p2 - p1, &ray.t);
-		ray.dP = sd->dP;
-		ray.dD = differential3_zero();
-		ray.time = sd->time;
-
-		/* intersect with the same object. if multiple intersections are
-		 * found it will randomly pick one of them */
-		Intersection isect;
-		if(scene_intersect_subsurface(kg, &ray, &isect, sd->object, lcg_state, 1) == 0)
-			continue;
-
-		/* setup new shading point */
-		shader_setup_from_subsurface(kg, sd, &isect, &ray);
-
-		hit = true;
-		num_attempts++;
-		break;
-	}
-
-	/* evaluate subsurface scattering closures */
-#ifdef BSSRDF_MULTI_EVAL
-	weight *= old_subsurface_scatter_multi_eval(kg, sd, hit, refl, r_attempts, num_attempts, all);
-#else
-	weight *= sc->weight;
-#endif
-
-	if(!hit)
-		weight = make_float3(0.0f, 0.0f, 0.0f);
-
-	/* optionally blur colors and bump mapping */
-	float3 N = sd->N;
-	subsurface_color_bump_blur(kg, sd, sd, state_flag, &weight, &N);
-
-	/* replace closures with a single diffuse BSDF */
-	subsurface_scatter_setup_diffuse_bsdf(sd, weight, hit, N);
-}
-
-__device bool old_subsurface_scatter_use(ShaderData *sd)
-{
-	for(int i = 0; i < sd->num_closure; i++) {
-		ShaderClosure *sc = &sd->closure[i];
-		

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list