Skip to content

Commit 25cae65

Browse files
committed
fix(compression): improve dominance computation
1 parent 9706199 commit 25cae65

File tree

1 file changed

+34
-12
lines changed

1 file changed

+34
-12
lines changed

includes/acl/compression/impl/rigid_shell_utils.h

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ namespace acl
7676
// retain the largest value. We then use this maximum value to compute our dominance.
7777

7878
rtm::qvvf* object_transforms = allocate_type_array<rtm::qvvf>(allocator, num_transforms);
79+
float* max_distance_to_parents = allocate_type_array<float>(allocator, num_transforms);
80+
81+
std::memset(max_distance_to_parents, 0, sizeof(float) * num_transforms);
7982

8083
// Our output buffer we'll return
8184
rigid_shell_metadata_t* shell_metadata = allocate_type_array<rigid_shell_metadata_t>(allocator, num_transforms);
@@ -155,10 +158,11 @@ namespace acl
155158
object_parent_position = object_transforms[parent_index].translation;
156159

157160
const float distance_to_parent = rtm::vector_distance3(object_transform.translation, object_parent_position);
158-
const float shell_distance = distance_to_parent + object_shell_distance;
159161

160162
rigid_shell_metadata_t& transform_shell_metadata = shell_metadata[transform_index];
161-
transform_shell_metadata.local_shell_distance = rtm::scalar_max(shell_distance, transform_shell_metadata.local_shell_distance);
163+
transform_shell_metadata.local_shell_distance = rtm::scalar_max(object_shell_distance, transform_shell_metadata.local_shell_distance);
164+
165+
max_distance_to_parents[transform_index] = rtm::scalar_max(distance_to_parent, max_distance_to_parents[transform_index]);
162166
}
163167
}
164168

@@ -179,17 +183,20 @@ namespace acl
179183

180184
rigid_shell_metadata_t& parent_shell = shell_metadata[parent_index];
181185

182-
if (shell_distance > parent_shell.local_shell_distance)
186+
const float distance_to_parent = max_distance_to_parents[transform_index];
187+
const float new_parent_shell_distance = shell_distance + distance_to_parent;
188+
if (new_parent_shell_distance > parent_shell.local_shell_distance)
183189
{
184190
// We are the new dominant transform, use our shell distance and precision
185-
parent_shell.local_shell_distance += shell_distance;
191+
parent_shell.local_shell_distance = new_parent_shell_distance;
186192
parent_shell.precision = transform_shell.precision;
187193
parent_shell.dominant_transform_index = transform_shell.dominant_transform_index;
188194
}
189195
}
190196
}
191197

192198
deallocate_type_array(allocator, object_transforms, num_transforms);
199+
deallocate_type_array(allocator, max_distance_to_parents, num_transforms);
193200

194201
return shell_metadata;
195202
}
@@ -223,6 +230,9 @@ namespace acl
223230
// retain the largest value. We then use this maximum value to compute our dominance.
224231

225232
rtm::qvvf* object_transforms = allocate_type_array<rtm::qvvf>(allocator, num_transforms);
233+
float* max_distance_to_parents = allocate_type_array<float>(allocator, num_transforms);
234+
235+
std::memset(max_distance_to_parents, 0, sizeof(float) * num_transforms);
226236

227237
// Initialize our output shell metadata
228238
for (uint32_t transform_index = 0; transform_index < num_transforms; ++transform_index)
@@ -312,10 +322,11 @@ namespace acl
312322
object_parent_position = object_transforms[parent_index].translation;
313323

314324
const float distance_to_parent = rtm::vector_distance3(object_transform.translation, object_parent_position);
315-
const float shell_distance = distance_to_parent + object_shell_distance;
316325

317326
rigid_shell_metadata_t& transform_shell_metadata = out_shell_metadata[transform_index];
318-
transform_shell_metadata.local_shell_distance = rtm::scalar_max(shell_distance, transform_shell_metadata.local_shell_distance);
327+
transform_shell_metadata.local_shell_distance = rtm::scalar_max(object_shell_distance, transform_shell_metadata.local_shell_distance);
328+
329+
max_distance_to_parents[transform_index] = rtm::scalar_max(distance_to_parent, max_distance_to_parents[transform_index]);
319330
}
320331
}
321332

@@ -336,17 +347,20 @@ namespace acl
336347

337348
rigid_shell_metadata_t& parent_shell = out_shell_metadata[parent_index];
338349

339-
if (shell_distance > parent_shell.local_shell_distance)
350+
const float distance_to_parent = max_distance_to_parents[transform_index];
351+
const float new_parent_shell_distance = shell_distance + distance_to_parent;
352+
if (new_parent_shell_distance > parent_shell.local_shell_distance)
340353
{
341354
// We are the new dominant transform, use our shell distance and precision
342-
parent_shell.local_shell_distance += shell_distance;
355+
parent_shell.local_shell_distance = new_parent_shell_distance;
343356
parent_shell.precision = transform_shell.precision;
344357
parent_shell.dominant_transform_index = transform_shell.dominant_transform_index;
345358
}
346359
}
347360
}
348361

349362
deallocate_type_array(allocator, object_transforms, num_transforms);
363+
deallocate_type_array(allocator, max_distance_to_parents, num_transforms);
350364
}
351365

352366
// We use the provided object space transforms to compute the rigid shell
@@ -365,6 +379,9 @@ namespace acl
365379
const clip_context& owner_clip_context = *segment.clip;
366380
const clip_topology_t* topology = owner_clip_context.topology;
367381

382+
float* max_distance_to_parents = allocate_type_array<float>(*segment.clip->allocator, num_transforms);
383+
std::memset(max_distance_to_parents, 0, sizeof(float) * num_transforms);
384+
368385
// Initialize our output shell metadata
369386
for (uint32_t transform_index = 0; transform_index < num_transforms; ++transform_index)
370387
{
@@ -399,10 +416,11 @@ namespace acl
399416
object_parent_position = object_pose_transforms[parent_index].translation;
400417

401418
const float distance_to_parent = rtm::vector_distance3(object_transform.translation, object_parent_position);
402-
const float shell_distance = distance_to_parent + object_shell_distance;
403419

404420
rigid_shell_metadata_t& transform_shell_metadata = out_shell_metadata[transform_index];
405-
transform_shell_metadata.local_shell_distance = rtm::scalar_max(shell_distance, transform_shell_metadata.local_shell_distance);
421+
transform_shell_metadata.local_shell_distance = rtm::scalar_max(object_shell_distance, transform_shell_metadata.local_shell_distance);
422+
423+
max_distance_to_parents[transform_index] = rtm::scalar_max(distance_to_parent, max_distance_to_parents[transform_index]);
406424
}
407425
}
408426

@@ -423,15 +441,19 @@ namespace acl
423441

424442
rigid_shell_metadata_t& parent_shell = out_shell_metadata[parent_index];
425443

426-
if (shell_distance > parent_shell.local_shell_distance)
444+
const float distance_to_parent = max_distance_to_parents[transform_index];
445+
const float new_parent_shell_distance = shell_distance + distance_to_parent;
446+
if (new_parent_shell_distance > parent_shell.local_shell_distance)
427447
{
428448
// We are the new dominant transform, use our shell distance and precision
429-
parent_shell.local_shell_distance += shell_distance;
449+
parent_shell.local_shell_distance = new_parent_shell_distance;
430450
parent_shell.precision = transform_shell.precision;
431451
parent_shell.dominant_transform_index = transform_shell.dominant_transform_index;
432452
}
433453
}
434454
}
455+
456+
deallocate_type_array(*segment.clip->allocator, max_distance_to_parents, num_transforms);
435457
}
436458
}
437459

0 commit comments

Comments
 (0)