Cleanup: Cycles: use one fewer object struct member for motion data
This commit is contained in:
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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<Hair *>(geom)->get_curve_keys().size() :
|
||||
(geom->geometry_type == Geometry::POINTCLOUD) ?
|
||||
static_cast<PointCloud *>(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<Mesh *>(geom)->get_verts().size() :
|
||||
(geom->geometry_type == Geometry::HAIR) ?
|
||||
static_cast<Hair *>(geom)->get_curve_keys().size() :
|
||||
(geom->geometry_type == Geometry::POINTCLOUD) ?
|
||||
static_cast<PointCloud *>(geom)->num_points() :
|
||||
0;
|
||||
kobject.patch_map_offset = 0;
|
||||
kobject.attribute_map_offset = 0;
|
||||
|
||||
Reference in New Issue
Block a user