@@ -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