diff --git a/intern/cycles/kernel/geom/motion_curve.h b/intern/cycles/kernel/geom/motion_curve.h index fb749bcbead..c8bc8640818 100644 --- a/intern/cycles/kernel/geom/motion_curve.h +++ b/intern/cycles/kernel/geom/motion_curve.h @@ -19,7 +19,7 @@ CCL_NAMESPACE_BEGIN ccl_device_inline void motion_curve_keys_for_step_linear(KernelGlobals kg, int offset, - int numkeys, + int numverts, int numsteps, int step, int k0, @@ -36,7 +36,7 @@ ccl_device_inline void motion_curve_keys_for_step_linear(KernelGlobals kg, if (step > numsteps) step--; - offset += step * numkeys; + offset += step * numverts; keys[0] = kernel_data_fetch(attributes_float4, offset + k0); keys[1] = kernel_data_fetch(attributes_float4, offset + k1); @@ -48,8 +48,8 @@ ccl_device_inline void motion_curve_keys_linear( KernelGlobals kg, int object, int prim, float time, int k0, int k1, float4 keys[2]) { /* get motion info */ - int numsteps, numkeys; - object_motion_info(kg, object, &numsteps, NULL, &numkeys); + const int numsteps = kernel_data_fetch(objects, object).numsteps; + const int numverts = kernel_data_fetch(objects, object).numverts; /* figure out which steps we need to fetch and their interpolation factor */ const int maxstep = numsteps * 2; @@ -63,8 +63,8 @@ ccl_device_inline void motion_curve_keys_linear( /* fetch key coordinates */ float4 next_keys[2]; - motion_curve_keys_for_step_linear(kg, offset, numkeys, numsteps, step, k0, k1, keys); - motion_curve_keys_for_step_linear(kg, offset, numkeys, numsteps, step + 1, k0, k1, next_keys); + motion_curve_keys_for_step_linear(kg, offset, numverts, numsteps, step, k0, k1, keys); + motion_curve_keys_for_step_linear(kg, offset, numverts, numsteps, step + 1, k0, k1, next_keys); /* interpolate between steps */ keys[0] = (1.0f - t) * keys[0] + t * next_keys[0]; @@ -73,7 +73,7 @@ ccl_device_inline void motion_curve_keys_linear( ccl_device_inline void motion_curve_keys_for_step(KernelGlobals kg, int offset, - int numkeys, + int numverts, int numsteps, int step, int k0, @@ -94,7 +94,7 @@ ccl_device_inline void motion_curve_keys_for_step(KernelGlobals kg, if (step > numsteps) step--; - offset += step * numkeys; + offset += step * numverts; keys[0] = kernel_data_fetch(attributes_float4, offset + k0); keys[1] = kernel_data_fetch(attributes_float4, offset + k1); @@ -115,8 +115,8 @@ ccl_device_inline void motion_curve_keys(KernelGlobals kg, float4 keys[4]) { /* get motion info */ - int numsteps, numkeys; - object_motion_info(kg, object, &numsteps, NULL, &numkeys); + const int numsteps = kernel_data_fetch(objects, object).numsteps; + const int numverts = kernel_data_fetch(objects, object).numverts; /* figure out which steps we need to fetch and their interpolation factor */ const int maxstep = numsteps * 2; @@ -130,8 +130,8 @@ ccl_device_inline void motion_curve_keys(KernelGlobals kg, /* fetch key coordinates */ float4 next_keys[4]; - motion_curve_keys_for_step(kg, offset, numkeys, numsteps, step, k0, k1, k2, k3, keys); - motion_curve_keys_for_step(kg, offset, numkeys, numsteps, step + 1, k0, k1, k2, k3, next_keys); + motion_curve_keys_for_step(kg, offset, numverts, numsteps, step, k0, k1, k2, k3, keys); + motion_curve_keys_for_step(kg, offset, numverts, numsteps, step + 1, k0, k1, k2, k3, next_keys); /* interpolate between steps */ keys[0] = (1.0f - t) * keys[0] + t * next_keys[0]; diff --git a/intern/cycles/kernel/geom/motion_point.h b/intern/cycles/kernel/geom/motion_point.h index bbc915b0b12..d6bfa527723 100644 --- a/intern/cycles/kernel/geom/motion_point.h +++ b/intern/cycles/kernel/geom/motion_point.h @@ -16,7 +16,7 @@ CCL_NAMESPACE_BEGIN #ifdef __POINTCLOUD__ ccl_device_inline float4 -motion_point_for_step(KernelGlobals kg, int offset, int numkeys, int numsteps, int step, int prim) +motion_point_for_step(KernelGlobals kg, int offset, int numverts, int numsteps, int step, int prim) { if (step == numsteps) { /* center step: regular key location */ @@ -27,7 +27,7 @@ motion_point_for_step(KernelGlobals kg, int offset, int numkeys, int numsteps, i if (step > numsteps) step--; - offset += step * numkeys; + offset += step * numverts; return kernel_data_fetch(attributes_float4, offset + prim); } @@ -37,8 +37,8 @@ motion_point_for_step(KernelGlobals kg, int offset, int numkeys, int numsteps, i ccl_device_inline float4 motion_point(KernelGlobals kg, int object, int prim, float time) { /* get motion info */ - int numsteps, numkeys; - object_motion_info(kg, object, &numsteps, NULL, &numkeys); + const int numsteps = kernel_data_fetch(objects, object).numsteps; + const int numverts = kernel_data_fetch(objects, object).numverts; /* figure out which steps we need to fetch and their interpolation factor */ int maxstep = numsteps * 2; @@ -50,8 +50,8 @@ ccl_device_inline float4 motion_point(KernelGlobals kg, int object, int prim, fl kernel_assert(offset != ATTR_STD_NOT_FOUND); /* fetch key coordinates */ - float4 point = motion_point_for_step(kg, offset, numkeys, numsteps, step, prim); - float4 next_point = motion_point_for_step(kg, offset, numkeys, numsteps, step + 1, prim); + float4 point = motion_point_for_step(kg, offset, numverts, numsteps, step, prim); + float4 next_point = motion_point_for_step(kg, offset, numverts, numsteps, step + 1, prim); /* interpolate between steps */ return (1.0f - t) * point + t * next_point; diff --git a/intern/cycles/kernel/geom/motion_triangle.h b/intern/cycles/kernel/geom/motion_triangle.h index b94a6ccdc3a..13df5a36825 100644 --- a/intern/cycles/kernel/geom/motion_triangle.h +++ b/intern/cycles/kernel/geom/motion_triangle.h @@ -83,12 +83,11 @@ ccl_device_inline void motion_triangle_compute_info(KernelGlobals kg, int prim, ccl_private uint3 *tri_vindex, ccl_private int *numsteps, - ccl_private int *numverts, ccl_private int *step, ccl_private float *t) { /* Get object motion info. */ - object_motion_info(kg, object, numsteps, numverts, NULL); + *numsteps = kernel_data_fetch(objects, object).numsteps; /* Figure out which steps we need to fetch and their interpolation factor. */ int maxstep = *numsteps * 2; @@ -126,12 +125,12 @@ ccl_device_inline void motion_triangle_vertices(KernelGlobals kg, ccl_device_inline void motion_triangle_vertices( KernelGlobals kg, int object, int prim, float time, float3 verts[3]) { - int numsteps, numverts, step; + int numsteps, step; float t; uint3 tri_vindex; - motion_triangle_compute_info( - kg, object, time, prim, &tri_vindex, &numsteps, &numverts, &step, &t); + motion_triangle_compute_info(kg, object, time, prim, &tri_vindex, &numsteps, &step, &t); + const int numverts = kernel_data_fetch(objects, object).numverts; motion_triangle_vertices(kg, object, tri_vindex, numsteps, numverts, step, t, verts); } @@ -163,12 +162,12 @@ ccl_device_inline void motion_triangle_normals(KernelGlobals kg, ccl_device_inline void motion_triangle_vertices_and_normals( KernelGlobals kg, int object, int prim, float time, float3 verts[3], float3 normals[3]) { - int numsteps, numverts, step; + int numsteps, step; float t; uint3 tri_vindex; - motion_triangle_compute_info( - kg, object, time, prim, &tri_vindex, &numsteps, &numverts, &step, &t); + motion_triangle_compute_info(kg, object, time, prim, &tri_vindex, &numsteps, &step, &t); + const int numverts = kernel_data_fetch(objects, object).numverts; motion_triangle_vertices(kg, object, tri_vindex, numsteps, numverts, step, t, verts); motion_triangle_normals(kg, object, tri_vindex, numsteps, numverts, step, t, normals); } @@ -178,13 +177,13 @@ ccl_device_inline float3 motion_triangle_smooth_normal(KernelGlobals kg, int object, uint3 tri_vindex, int numsteps, - int numverts, int step, float t, float u, float v) { float3 normals[3]; + const int numverts = kernel_data_fetch(objects, object).numverts; motion_triangle_normals(kg, object, tri_vindex, numsteps, numverts, step, t, normals); /* Interpolate between normals. */ @@ -197,14 +196,12 @@ ccl_device_inline float3 motion_triangle_smooth_normal(KernelGlobals kg, ccl_device_inline float3 motion_triangle_smooth_normal( KernelGlobals kg, float3 Ng, int object, int prim, float u, float v, float time) { - int numsteps, numverts, step; + int numsteps, step; float t; uint3 tri_vindex; - motion_triangle_compute_info( - kg, object, time, prim, &tri_vindex, &numsteps, &numverts, &step, &t); + motion_triangle_compute_info(kg, object, time, prim, &tri_vindex, &numsteps, &step, &t); - return motion_triangle_smooth_normal( - kg, Ng, object, tri_vindex, numsteps, numverts, step, t, u, v); + return motion_triangle_smooth_normal(kg, Ng, object, tri_vindex, numsteps, step, t, u, v); } CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/geom/motion_triangle_shader.h b/intern/cycles/kernel/geom/motion_triangle_shader.h index 6dec78c7e16..0903d8956f9 100644 --- a/intern/cycles/kernel/geom/motion_triangle_shader.h +++ b/intern/cycles/kernel/geom/motion_triangle_shader.h @@ -35,13 +35,14 @@ ccl_device_noinline void motion_triangle_shader_setup(KernelGlobals kg, sd->shader = kernel_data_fetch(tri_shader, sd->prim); /* Compute motion info. */ - int numsteps, numverts, step; + int numsteps, step; float t; uint3 tri_vindex; motion_triangle_compute_info( - kg, sd->object, sd->time, sd->prim, &tri_vindex, &numsteps, &numverts, &step, &t); + kg, sd->object, sd->time, sd->prim, &tri_vindex, &numsteps, &step, &t); float3 verts[3]; + const int numverts = kernel_data_fetch(objects, sd->object).numverts; motion_triangle_vertices(kg, sd->object, tri_vindex, numsteps, numverts, step, t, verts); /* Compute refined position. */ @@ -64,7 +65,7 @@ ccl_device_noinline void motion_triangle_shader_setup(KernelGlobals kg, /* Compute smooth normal. */ if (sd->shader & SHADER_SMOOTH_NORMAL) { sd->N = motion_triangle_smooth_normal( - kg, Ng, sd->object, tri_vindex, numsteps, numverts, step, t, sd->u, sd->v); + kg, Ng, sd->object, tri_vindex, numsteps, step, t, sd->u, sd->v); } } diff --git a/intern/cycles/kernel/geom/object.h b/intern/cycles/kernel/geom/object.h index b636028b8b3..dede56292c0 100644 --- a/intern/cycles/kernel/geom/object.h +++ b/intern/cycles/kernel/geom/object.h @@ -368,24 +368,6 @@ ccl_device_inline float3 object_dupli_uv(KernelGlobals kg, int object) return make_float3(kobject->dupli_uv[0], kobject->dupli_uv[1], 0.0f); } -/* Information about mesh for motion blurred triangles and curves */ - -ccl_device_inline void object_motion_info(KernelGlobals kg, - int object, - ccl_private int *numsteps, - ccl_private int *numverts, - ccl_private int *numkeys) -{ - if (numkeys) { - *numkeys = kernel_data_fetch(objects, object).numkeys; - } - - if (numsteps) - *numsteps = kernel_data_fetch(objects, object).numsteps; - if (numverts) - *numverts = kernel_data_fetch(objects, object).numverts; -} - /* Offset to an objects patch map */ ccl_device_inline uint object_patch_map_offset(KernelGlobals kg, int object) diff --git a/intern/cycles/kernel/geom/primitive.h b/intern/cycles/kernel/geom/primitive.h index d19fc9c015b..39c5b492bb6 100644 --- a/intern/cycles/kernel/geom/primitive.h +++ b/intern/cycles/kernel/geom/primitive.h @@ -302,13 +302,12 @@ ccl_device_forceinline float4 primitive_motion_vector(KernelGlobals kg, if (desc.offset != ATTR_STD_NOT_FOUND) { /* get motion info */ - int numverts, numkeys; - object_motion_info(kg, sd->object, NULL, &numverts, &numkeys); + const int numverts = kernel_data_fetch(objects, sd->object).numverts; #if defined(__HAIR__) || defined(__POINTCLOUD__) if (is_curve_or_point) { motion_pre = float4_to_float3(curve_attribute_float4(kg, sd, desc, NULL, NULL)); - desc.offset += numkeys; + desc.offset += numverts; motion_post = float4_to_float3(curve_attribute_float4(kg, sd, desc, NULL, NULL)); /* Curve */ diff --git a/intern/cycles/scene/object.cpp b/intern/cycles/scene/object.cpp index d9b9e320b24..ec852e74789 100644 --- a/intern/cycles/scene/object.cpp +++ b/intern/cycles/scene/object.cpp @@ -571,11 +571,6 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s kobject.dupli_generated[0] = ob->dupli_generated[0]; kobject.dupli_generated[1] = ob->dupli_generated[1]; kobject.dupli_generated[2] = ob->dupli_generated[2]; - kobject.numkeys = (geom->geometry_type == Geometry::HAIR) ? - static_cast(geom)->get_curve_keys().size() : - (geom->geometry_type == Geometry::POINTCLOUD) ? - static_cast(geom)->num_points() : - 0; kobject.dupli_uv[0] = ob->dupli_uv[0]; kobject.dupli_uv[1] = ob->dupli_uv[1]; int totalsteps = geom->get_motion_steps(); @@ -583,6 +578,10 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s kobject.numverts = (geom->geometry_type == Geometry::MESH || geom->geometry_type == Geometry::VOLUME) ? static_cast(geom)->get_verts().size() : + (geom->geometry_type == Geometry::HAIR) ? + static_cast(geom)->get_curve_keys().size() : + (geom->geometry_type == Geometry::POINTCLOUD) ? + static_cast(geom)->num_points() : 0; kobject.patch_map_offset = 0; kobject.attribute_map_offset = 0;