[Bf-blender-cvs] [5ab5652] master: Cycles code refactor: minor changes to light emission code.

Brecht Van Lommel noreply at git.blender.org
Sat Jun 14 13:55:28 CEST 2014


Commit: 5ab565283d594e51ef2589326bc68957c323061d
Author: Brecht Van Lommel
Date:   Thu Apr 3 22:43:56 2014 +0200
https://developer.blender.org/rB5ab565283d594e51ef2589326bc68957c323061d

Cycles code refactor: minor changes to light emission code.

===================================================================

M	intern/cycles/kernel/kernel_emission.h
M	intern/cycles/kernel/kernel_path.h

===================================================================

diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index deffa7f..b382e2c 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -63,32 +63,18 @@ ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
 	return eval;
 }
 
-ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
-	float randt, float randu, float randv, Ray *ray, BsdfEval *eval,
-	bool *is_lamp, int bounce, int transparent_bounce)
+ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd,
+	LightSample *ls, Ray *ray, BsdfEval *eval, bool *is_lamp,
+	int bounce, int transparent_bounce)
 {
-	LightSample ls;
-
-#ifdef __BRANCHED_PATH__
-	if(lindex != LAMP_NONE) {
-		/* sample position on a specified light */
-		light_select(kg, lindex, randu, randv, sd->P, &ls);
-	}
-	else
-#endif
-	{
-		/* sample a light and position on int */
-		light_sample(kg, randt, randu, randv, sd->time, sd->P, &ls);
-	}
-
-	if(ls.pdf == 0.0f)
+	if(ls->pdf == 0.0f)
 		return false;
 
 	/* todo: implement */
 	differential3 dD = differential3_zero();
 
 	/* evaluate closure */
-	float3 light_eval = direct_emissive_eval(kg, &ls, -ls.D, dD, ls.t, sd->time, bounce, transparent_bounce);
+	float3 light_eval = direct_emissive_eval(kg, ls, -ls->D, dD, ls->t, sd->time, bounce, transparent_bounce);
 
 	if(is_zero(light_eval))
 		return false;
@@ -98,29 +84,29 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int
 
 #ifdef __VOLUME__
 	if(sd->prim != PRIM_NONE)
-		shader_bsdf_eval(kg, sd, ls.D, eval, &bsdf_pdf);
+		shader_bsdf_eval(kg, sd, ls->D, eval, &bsdf_pdf);
 	else
-		shader_volume_phase_eval(kg, sd, ls.D, eval, &bsdf_pdf);
+		shader_volume_phase_eval(kg, sd, ls->D, eval, &bsdf_pdf);
 #else
-	shader_bsdf_eval(kg, sd, ls.D, eval, &bsdf_pdf);
+	shader_bsdf_eval(kg, sd, ls->D, eval, &bsdf_pdf);
 #endif
 
-	if(ls.shader & SHADER_USE_MIS) {
+	if(ls->shader & SHADER_USE_MIS) {
 		/* multiple importance sampling */
-		float mis_weight = power_heuristic(ls.pdf, bsdf_pdf);
+		float mis_weight = power_heuristic(ls->pdf, bsdf_pdf);
 		light_eval *= mis_weight;
 	}
 	
-	bsdf_eval_mul(eval, light_eval/ls.pdf);
+	bsdf_eval_mul(eval, light_eval/ls->pdf);
 
 #ifdef __PASSES__
 	/* use visibility flag to skip lights */
-	if(ls.shader & SHADER_EXCLUDE_ANY) {
-		if(ls.shader & SHADER_EXCLUDE_DIFFUSE)
+	if(ls->shader & SHADER_EXCLUDE_ANY) {
+		if(ls->shader & SHADER_EXCLUDE_DIFFUSE)
 			eval->diffuse = make_float3(0.0f, 0.0f, 0.0f);
-		if(ls.shader & SHADER_EXCLUDE_GLOSSY)
+		if(ls->shader & SHADER_EXCLUDE_GLOSSY)
 			eval->glossy = make_float3(0.0f, 0.0f, 0.0f);
-		if(ls.shader & SHADER_EXCLUDE_TRANSMIT)
+		if(ls->shader & SHADER_EXCLUDE_TRANSMIT)
 			eval->transmission = make_float3(0.0f, 0.0f, 0.0f);
 	}
 #endif
@@ -128,19 +114,19 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int
 	if(bsdf_eval_is_zero(eval))
 		return false;
 
-	if(ls.shader & SHADER_CAST_SHADOW) {
+	if(ls->shader & SHADER_CAST_SHADOW) {
 		/* setup ray */
-		bool transmit = (dot(sd->Ng, ls.D) < 0.0f);
+		bool transmit = (dot(sd->Ng, ls->D) < 0.0f);
 		ray->P = ray_offset(sd->P, (transmit)? -sd->Ng: sd->Ng);
 
-		if(ls.t == FLT_MAX) {
+		if(ls->t == FLT_MAX) {
 			/* distant light */
-			ray->D = ls.D;
-			ray->t = ls.t;
+			ray->D = ls->D;
+			ray->t = ls->t;
 		}
 		else {
 			/* other lights, avoid self-intersection */
-			ray->D = ray_offset(ls.P, ls.Ng) - ray->P;
+			ray->D = ray_offset(ls->P, ls->Ng) - ray->P;
 			ray->D = normalize_len(ray->D, &ray->t);
 		}
 
@@ -153,7 +139,7 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int
 	}
 
 	/* return if it's a lamp for shadow pass */
-	*is_lamp = (ls.prim == PRIM_NONE && ls.type != LIGHT_BACKGROUND);
+	*is_lamp = (ls->prim == PRIM_NONE && ls->type != LIGHT_BACKGROUND);
 
 	return true;
 }
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index b57e274..70366ea 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -52,29 +52,30 @@ ccl_device_inline bool kernel_path_integrate_scatter_lighting(KernelGlobals *kg,
 	float num_samples_adjust)
 {
 #ifdef __EMISSION__
-	if(kernel_data.integrator.use_direct_light) {
+	if(kernel_data.integrator.use_direct_light && (sd->flag & SD_BSDF_HAS_EVAL)) {
 		/* sample illumination from lights to find path contribution */
-		if(sd->flag & SD_BSDF_HAS_EVAL) {
-			float light_t = path_state_rng_1D(kg, rng, state, PRNG_LIGHT);
-			float light_u, light_v;
-			path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, &light_u, &light_v);
+		float light_t = path_state_rng_1D(kg, rng, state, PRNG_LIGHT);
+		float light_u, light_v;
+		path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, &light_u, &light_v);
 
-			Ray light_ray;
-			BsdfEval L_light;
-			bool is_lamp;
+		Ray light_ray;
+		BsdfEval L_light;
+		bool is_lamp;
 
 #ifdef __OBJECT_MOTION__
-			light_ray.time = sd->time;
+		light_ray.time = sd->time;
 #endif
 
-			if(direct_emission(kg, sd, LAMP_NONE, light_t, light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
-				/* trace shadow ray */
-				float3 shadow;
+		LightSample ls;
+		light_sample(kg, light_t, light_u, light_v, sd->time, sd->P, &ls);
 
-				if(!shadow_blocked(kg, state, &light_ray, &shadow)) {
-					/* accumulate */
-					path_radiance_accum_light(L, *throughput * num_samples_adjust, &L_light, shadow, 1.0f, state->bounce, is_lamp);
-				}
+		if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
+			/* trace shadow ray */
+			float3 shadow;
+
+			if(!shadow_blocked(kg, state, &light_ray, &shadow)) {
+				/* accumulate */
+				path_radiance_accum_light(L, *throughput * num_samples_adjust, &L_light, shadow, 1.0f, state->bounce, is_lamp);
 			}
 		}
 	}
@@ -152,7 +153,10 @@ ccl_device void kernel_branched_path_integrate_direct_lighting(KernelGlobals *kg
 					float light_u, light_v;
 					path_branched_rng_2D(kg, &lamp_rng, state, j, num_samples, PRNG_LIGHT_U, &light_u, &light_v);
 
-					if(direct_emission(kg, sd, i, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
+					LightSample ls;
+					light_select(kg, i, light_u, light_v, sd->P, &ls);
+
+					if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
 						/* trace shadow ray */
 						float3 shadow;
 
@@ -181,7 +185,10 @@ ccl_device void kernel_branched_path_integrate_direct_lighting(KernelGlobals *kg
 					if(kernel_data.integrator.num_all_lights)
 						light_t = 0.5f*light_t;
 
-					if(direct_emission(kg, sd, LAMP_NONE, light_t, light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
+					LightSample ls;
+					light_sample(kg, light_t, light_u, light_v, sd->time, sd->P, &ls);
+
+					if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
 						/* trace shadow ray */
 						float3 shadow;
 
@@ -198,8 +205,11 @@ ccl_device void kernel_branched_path_integrate_direct_lighting(KernelGlobals *kg
 			float light_u, light_v;
 			path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, &light_u, &light_v);
 
+			LightSample ls;
+			light_sample(kg, light_t, light_u, light_v, sd->time, sd->P, &ls);
+
 			/* sample random light */
-			if(direct_emission(kg, sd, LAMP_NONE, light_t, light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
+			if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
 				/* trace shadow ray */
 				float3 shadow;
 
@@ -477,7 +487,10 @@ ccl_device_inline bool kernel_path_integrate_lighting(KernelGlobals *kg, RNG *rn
 			light_ray.time = sd->time;
 #endif
 
-			if(direct_emission(kg, sd, LAMP_NONE, light_t, light_u, light_v, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
+			LightSample ls;
+			light_sample(kg, light_t, light_u, light_v, sd->time, sd->P, &ls);
+
+			if(direct_emission(kg, sd, &ls, &light_ray, &L_light, &is_lamp, state->bounce, state->transparent_bounce)) {
 				/* trace shadow ray */
 				float3 shadow;
 
@@ -882,7 +895,10 @@ ccl_device float4 kernel_path_integrate(KernelGlobals *kg, RNG *rng, int sample,
 				light_ray.time = sd.time;
 #endif
 
-				if(direct_emission(kg, &sd, LAMP_NONE, light_t, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce, state.transparent_bounce)) {
+				LightSample ls;
+				light_sample(kg, light_t, light_u, light_v, sd.time, sd.P, &ls);
+
+				if(direct_emission(kg, &sd, &ls, &light_ray, &L_light, &is_lamp, state.bounce, state.transparent_bounce)) {
 					/* trace shadow ray */
 					float3 shadow;




More information about the Bf-blender-cvs mailing list