diff --git a/intern/cycles/kernel/kernel_bvh.h b/intern/cycles/kernel/kernel_bvh.h index d033fb1d145..e3c8b796e9c 100644 --- a/intern/cycles/kernel/kernel_bvh.h +++ b/intern/cycles/kernel/kernel_bvh.h @@ -443,13 +443,19 @@ __device_inline bool bvh_intersect_motion(KernelGlobals *kg, const Ray *ray, con __device_inline bool scene_intersect(KernelGlobals *kg, const Ray *ray, const uint visibility, Intersection *isect) { - /* todo: fix cuda sm 2.0 motion blur */ -#if defined(__OBJECT_MOTION__) && (!defined(__KERNEL_CUDA) || (__CUDA_ARCH__ >= 210)) +#ifdef __OBJECT_MOTION__ +#if !defined(__KERNEL_CUDA__) || (__CUDA_ARCH__ >= 210) if(kernel_data.bvh.have_motion) return bvh_intersect_motion(kg, ray, visibility, isect); else -#endif return bvh_intersect(kg, ray, visibility, isect); +#else + /* todo: fix cuda sm 2.0 motion blur */ + return bvh_intersect(kg, ray, visibility, isect); +#endif +#else + return bvh_intersect(kg, ray, visibility, isect); +#endif } __device_inline float3 ray_offset(float3 P, float3 Ng) diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 75b6df5f08f..6d650a0158d 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -32,6 +32,10 @@ __device float3 direct_emissive_eval(KernelGlobals *kg, float rando, Ray ray; ray.D = ls->D; ray.P = ls->P; + ray.t = 1.0f; +#ifdef __OBJECT_MOTION__ + ray.time = time; +#endif ray.dP.dx = make_float3(0.0f, 0.0f, 0.0f); ray.dP.dy = make_float3(0.0f, 0.0f, 0.0f); #ifdef __CAMERA_MOTION__ diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 4cf414091f5..c341269f4ca 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -514,7 +514,9 @@ typedef struct KernelCamera { /* more matrices */ Transform screentoworld; Transform rastertoworld; - Transform ndctoworld; + /* work around cuda sm 2.0 crash, this seems to + * cross some limit in combination with motion + * Transform ndctoworld; */ Transform worldtoscreen; Transform worldtoraster; Transform worldtondc; diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp index 624d20bbd01..e8f7e966e92 100644 --- a/intern/cycles/kernel/osl/osl_services.cpp +++ b/intern/cycles/kernel/osl/osl_services.cpp @@ -224,7 +224,7 @@ bool OSLRenderServices::get_matrix(OSL::Matrix44 &result, ustring from) KernelGlobals *kg = kernel_globals; if (from == u_ndc) { - Transform tfm = transform_transpose(kernel_data.cam.ndctoworld); + Transform tfm = transform_transpose(transform_quick_inverse(kernel_data.cam.worldtondc)); result = TO_MATRIX44(tfm); return true; } diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp index 7703d0cbc8e..649936bec04 100644 --- a/intern/cycles/render/camera.cpp +++ b/intern/cycles/render/camera.cpp @@ -162,7 +162,6 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene) /* store matrices */ kcam->screentoworld = screentoworld; kcam->rastertoworld = rastertoworld; - kcam->ndctoworld = ndctoworld; kcam->rastertocamera = rastertocamera; kcam->cameratoworld = cameratoworld; kcam->worldtoscreen = transform_inverse(screentoworld);