Cycles: Cleanup, spherical_stereo_direction will return normalized direction

Previously each call of this function was followed by a normaliztion, now it
is done in the function itself with an according note around the function.
This commit is contained in:
Sergey Sharybin 2016-03-11 21:22:19 +05:00
parent e327fb522a
commit a8c87bad22
2 changed files with 11 additions and 11 deletions

@ -109,7 +109,6 @@ ccl_device void camera_sample_perspective(KernelGlobals *kg, float raster_x, flo
float3 tD = transform_direction(&cameratoworld, ray->D);
ray->P = spherical_stereo_position(kg, tD, tP);
ray->D = spherical_stereo_direction(kg, tD, tP, ray->P);
ray->D = normalize(ray->D);
#ifdef __RAY_DIFFERENTIALS__
/* ray differential */
@ -117,18 +116,18 @@ ccl_device void camera_sample_perspective(KernelGlobals *kg, float raster_x, flo
tD = transform_direction(&cameratoworld, Pcamera);
float3 Pdiff = spherical_stereo_position(kg, tD, Pcamera);
float3 Ddiff = normalize(spherical_stereo_direction(kg, tD, Pcamera, Pdiff));
float3 Ddiff = spherical_stereo_direction(kg, tD, Pcamera, Pdiff);
tP = transform_perspective(&rastertocamera, make_float3(raster_x + 1.0f, raster_y, 0.0f));
tD = transform_direction(&cameratoworld, tP);
Pcamera = spherical_stereo_position(kg, tD, tP);
ray->dD.dx = normalize(spherical_stereo_direction(kg, tD, tP, Pcamera)) - Ddiff;
ray->dD.dx = spherical_stereo_direction(kg, tD, tP, Pcamera) - Ddiff;
ray->dP.dx = Pcamera - Pdiff;
tP = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y + 1.0f, 0.0f));
tD = transform_direction(&cameratoworld, tP);
Pcamera = spherical_stereo_position(kg, tD, tP);
ray->dD.dy = normalize(spherical_stereo_direction(kg, tD, tP, Pcamera)) - Ddiff;
ray->dD.dy = spherical_stereo_direction(kg, tD, tP, Pcamera) - Ddiff;
/* dP.dy is zero, since the omnidirectional panorama only shift the eyes horizontally */
#endif
@ -276,7 +275,6 @@ ccl_device void camera_sample_panorama(KernelGlobals *kg, float raster_x, float
float3 tD = transform_direction(&cameratoworld, ray->D);
ray->P = spherical_stereo_position(kg, tD, tP);
ray->D = spherical_stereo_direction(kg, tD, tP, ray->P);
ray->D = normalize(ray->D);
#ifdef __RAY_DIFFERENTIALS__
/* ray differential */
@ -285,18 +283,18 @@ ccl_device void camera_sample_panorama(KernelGlobals *kg, float raster_x, float
tP = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
tD = transform_direction(&cameratoworld, panorama_to_direction(kg, tP.x, tP.y));
float3 Pdiff = spherical_stereo_position(kg, tD, tP);
float3 Ddiff = normalize(spherical_stereo_direction(kg, tD, tP, Pdiff));
float3 Ddiff = spherical_stereo_direction(kg, tD, tP, Pdiff);
tP = transform_perspective(&rastertocamera, make_float3(raster_x + 1.0f, raster_y, 0.0f));
tD = transform_direction(&cameratoworld, panorama_to_direction(kg, tP.x, tP.y));
Pcamera = spherical_stereo_position(kg, tD, tP);
ray->dD.dx = normalize(spherical_stereo_direction(kg, tD, tP, Pcamera)) - Ddiff;
ray->dD.dx = spherical_stereo_direction(kg, tD, tP, Pcamera) - Ddiff;
ray->dP.dx = Pcamera - Pdiff;
tP = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y + 1.0f, 0.0f));
tD = transform_direction(&cameratoworld, panorama_to_direction(kg, tP.x, tP.y));
Pcamera = spherical_stereo_position(kg, tD, tP);
ray->dD.dy = normalize(spherical_stereo_direction(kg, tD, tP, Pcamera)) - Ddiff;
ray->dD.dy = spherical_stereo_direction(kg, tD, tP, Pcamera) - Ddiff;
/* dP.dy is zero, since the omnidirectional panorama only shift the eyes horizontally */
#endif
}

@ -241,20 +241,22 @@ ccl_device float3 spherical_stereo_position(KernelGlobals *kg,
return pos + (side * interocular_offset);
}
/* NOTE: Ensures direction is normalized. */
ccl_device float3 spherical_stereo_direction(KernelGlobals *kg,
float3 dir,
float3 pos,
float3 newpos)
{
const float3 normalized_dir = normalize(dir);
/* Interocular offset of zero means either no stereo, or stereo without
* spherical stereo.
*/
if(kernel_data.cam.interocular_offset == 0.0f) {
return dir;
return normalized_dir;
}
float3 screenpos = pos + (normalize(dir) * kernel_data.cam.convergence_distance);
return screenpos - newpos;
float3 screenpos = pos + (normalized_dir * kernel_data.cam.convergence_distance);
return normalize(screenpos - newpos);
}
CCL_NAMESPACE_END