From d06b1a5d8bb219c0935373cd5758a9bdacd6ec36 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 19 Nov 2014 02:42:22 +0500 Subject: Cycles: Missed some changes in the previous hair motion blur fix So now cases when object has both hair motion blur and deformation motion blur vector pass is all correct. We could get rid of the flag in the future, still need to look deeper into all the areas trying to find a more clear solution. --- intern/cycles/kernel/geom/geom_primitive.h | 2 +- intern/cycles/kernel/kernel_types.h | 1 + intern/cycles/render/object.cpp | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) (limited to 'intern/cycles') diff --git a/intern/cycles/kernel/geom/geom_primitive.h b/intern/cycles/kernel/geom/geom_primitive.h index 707977750bc..207d5066fb2 100644 --- a/intern/cycles/kernel/geom/geom_primitive.h +++ b/intern/cycles/kernel/geom/geom_primitive.h @@ -173,7 +173,7 @@ ccl_device float4 primitive_motion_vector(KernelGlobals *kg, ShaderData *sd) motion_post = primitive_attribute_float3(kg, sd, elem, offset_next, NULL, NULL); #ifdef __HAIR__ - if(is_curve_primitive) { + if(is_curve_primitive && (sd->flag & SD_OBJECT_HAS_VERTEX_MOTION) == 0) { object_position_transform(kg, sd, &motion_pre); object_position_transform(kg, sd, &motion_post); } diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 25b13f74b30..95d38a4dbb7 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -631,6 +631,7 @@ enum ShaderDataFlag { SD_NEGATIVE_SCALE_APPLIED = (1 << 24), /* vertices have negative scale applied */ SD_OBJECT_HAS_VOLUME = (1 << 25), /* object has a volume shader */ SD_OBJECT_INTERSECTS_VOLUME = (1 << 26), /* object intersects AABB of an object with volume shader */ + SD_OBJECT_HAS_VERTEX_MOTION = (1 << 22), /* has position for motion vertices */ SD_OBJECT_FLAGS = (SD_HOLDOUT_MASK|SD_OBJECT_MOTION|SD_TRANSFORM_APPLIED| SD_NEGATIVE_SCALE_APPLIED|SD_OBJECT_HAS_VOLUME| diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index 46ddab235d9..3b2a3ae0b33 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -318,6 +318,9 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene mtfm_pre = mtfm_pre * itfm; mtfm_post = mtfm_post * itfm; } + else { + flag |= SD_OBJECT_HAS_VERTEX_MOTION; + } memcpy(&objects_vector[i*OBJECT_VECTOR_SIZE+0], &mtfm_pre, sizeof(float4)*3); memcpy(&objects_vector[i*OBJECT_VECTOR_SIZE+3], &mtfm_post, sizeof(float4)*3); -- cgit v1.2.3