Cleanup: Cycles: use one fewer object struct member for motion data

This commit is contained in:
Brecht Van Lommel
2024-01-09 11:59:05 +01:00
parent 5b6f2ef5a2
commit 8087dd9e96
7 changed files with 39 additions and 61 deletions
+12 -12
View File
@@ -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];
+6 -6
View File
@@ -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;
+11 -14
View File
@@ -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);
}
}
-18
View File
@@ -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)
+2 -3
View File
@@ -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 */
+4 -5
View File
@@ -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;