forked from bartvdbraak/blender
Fix cycles motion pass for hair curves showing a bit of motion when there isn't any.
This commit is contained in:
parent
6f71491d61
commit
fe00dbcc23
@ -125,6 +125,23 @@ ccl_device float curve_thickness(KernelGlobals *kg, ShaderData *sd)
|
|||||||
return r*2.0f;
|
return r*2.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Curve location for motion pass, linear interpolation between keys and
|
||||||
|
* ignoring radius because we do the same for the motion keys */
|
||||||
|
|
||||||
|
ccl_device float3 curve_motion_center_location(KernelGlobals *kg, ShaderData *sd)
|
||||||
|
{
|
||||||
|
float4 curvedata = kernel_tex_fetch(__curves, sd->prim);
|
||||||
|
int k0 = __float_as_int(curvedata.x) + PRIMITIVE_UNPACK_SEGMENT(sd->type);
|
||||||
|
int k1 = k0 + 1;
|
||||||
|
|
||||||
|
float4 P_curve[2];
|
||||||
|
|
||||||
|
P_curve[0]= kernel_tex_fetch(__curve_keys, k0);
|
||||||
|
P_curve[1]= kernel_tex_fetch(__curve_keys, k1);
|
||||||
|
|
||||||
|
return float4_to_float3(P_curve[1]) * sd->u + float4_to_float3(P_curve[0]) * (1.0f - sd->u);
|
||||||
|
}
|
||||||
|
|
||||||
/* Curve tangent normal */
|
/* Curve tangent normal */
|
||||||
|
|
||||||
ccl_device float3 curve_tangent_normal(KernelGlobals *kg, ShaderData *sd)
|
ccl_device float3 curve_tangent_normal(KernelGlobals *kg, ShaderData *sd)
|
||||||
|
@ -140,7 +140,19 @@ ccl_device float3 primitive_tangent(KernelGlobals *kg, ShaderData *sd)
|
|||||||
|
|
||||||
ccl_device float4 primitive_motion_vector(KernelGlobals *kg, ShaderData *sd)
|
ccl_device float4 primitive_motion_vector(KernelGlobals *kg, ShaderData *sd)
|
||||||
{
|
{
|
||||||
float3 motion_pre = sd->P, motion_post = sd->P;
|
/* center position */
|
||||||
|
float3 center;
|
||||||
|
|
||||||
|
if(sd->type & PRIMITIVE_ALL_CURVE) {
|
||||||
|
center = curve_motion_center_location(kg, sd);
|
||||||
|
|
||||||
|
if(!(sd->flag & SD_TRANSFORM_APPLIED))
|
||||||
|
object_position_transform(kg, sd, ¢er);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
center = sd->P;
|
||||||
|
|
||||||
|
float3 motion_pre = center, motion_post = center;
|
||||||
|
|
||||||
/* deformation motion */
|
/* deformation motion */
|
||||||
AttributeElement elem;
|
AttributeElement elem;
|
||||||
@ -168,13 +180,13 @@ ccl_device float4 primitive_motion_vector(KernelGlobals *kg, ShaderData *sd)
|
|||||||
tfm = object_fetch_vector_transform(kg, sd->object, OBJECT_VECTOR_MOTION_POST);
|
tfm = object_fetch_vector_transform(kg, sd->object, OBJECT_VECTOR_MOTION_POST);
|
||||||
motion_post = transform_point(&tfm, motion_post);
|
motion_post = transform_point(&tfm, motion_post);
|
||||||
|
|
||||||
float3 P;
|
float3 motion_center;
|
||||||
|
|
||||||
/* camera motion, for perspective/orthographic motion.pre/post will be a
|
/* camera motion, for perspective/orthographic motion.pre/post will be a
|
||||||
* world-to-raster matrix, for panorama it's world-to-camera */
|
* world-to-raster matrix, for panorama it's world-to-camera */
|
||||||
if (kernel_data.cam.type != CAMERA_PANORAMA) {
|
if (kernel_data.cam.type != CAMERA_PANORAMA) {
|
||||||
tfm = kernel_data.cam.worldtoraster;
|
tfm = kernel_data.cam.worldtoraster;
|
||||||
P = transform_perspective(&tfm, sd->P);
|
motion_center = transform_perspective(&tfm, center);
|
||||||
|
|
||||||
tfm = kernel_data.cam.motion.pre;
|
tfm = kernel_data.cam.motion.pre;
|
||||||
motion_pre = transform_perspective(&tfm, motion_pre);
|
motion_pre = transform_perspective(&tfm, motion_pre);
|
||||||
@ -184,10 +196,10 @@ ccl_device float4 primitive_motion_vector(KernelGlobals *kg, ShaderData *sd)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tfm = kernel_data.cam.worldtocamera;
|
tfm = kernel_data.cam.worldtocamera;
|
||||||
P = normalize(transform_point(&tfm, sd->P));
|
motion_center = normalize(transform_point(&tfm, center));
|
||||||
P = float2_to_float3(direction_to_panorama(kg, P));
|
motion_center = float2_to_float3(direction_to_panorama(kg, motion_center));
|
||||||
P.x *= kernel_data.cam.width;
|
motion_center.x *= kernel_data.cam.width;
|
||||||
P.y *= kernel_data.cam.height;
|
motion_center.y *= kernel_data.cam.height;
|
||||||
|
|
||||||
tfm = kernel_data.cam.motion.pre;
|
tfm = kernel_data.cam.motion.pre;
|
||||||
motion_pre = normalize(transform_point(&tfm, motion_pre));
|
motion_pre = normalize(transform_point(&tfm, motion_pre));
|
||||||
@ -202,8 +214,8 @@ ccl_device float4 primitive_motion_vector(KernelGlobals *kg, ShaderData *sd)
|
|||||||
motion_post.y *= kernel_data.cam.height;
|
motion_post.y *= kernel_data.cam.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
motion_pre = motion_pre - P;
|
motion_pre = motion_pre - motion_center;
|
||||||
motion_post = P - motion_post;
|
motion_post = motion_center - motion_post;
|
||||||
|
|
||||||
return make_float4(motion_pre.x, motion_pre.y, motion_post.x, motion_post.y);
|
return make_float4(motion_pre.x, motion_pre.y, motion_post.x, motion_post.y);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user