pymomentum-cpu 0.1.93.post0__cp312-cp312-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (517) hide show
  1. include/axel/BoundingBox.h +59 -0
  2. include/axel/Bvh.h +708 -0
  3. include/axel/BvhBase.h +75 -0
  4. include/axel/BvhCommon.h +43 -0
  5. include/axel/BvhEmbree.h +87 -0
  6. include/axel/BvhFactory.h +34 -0
  7. include/axel/Checks.h +21 -0
  8. include/axel/DualContouring.h +79 -0
  9. include/axel/KdTree.h +208 -0
  10. include/axel/Log.h +22 -0
  11. include/axel/MeshToSdf.h +123 -0
  12. include/axel/Profile.h +64 -0
  13. include/axel/Ray.h +45 -0
  14. include/axel/SignedDistanceField.h +248 -0
  15. include/axel/SimdKdTree.h +515 -0
  16. include/axel/TriBvh.h +157 -0
  17. include/axel/TriBvhEmbree.h +57 -0
  18. include/axel/common/Constants.h +27 -0
  19. include/axel/common/Types.h +21 -0
  20. include/axel/common/VectorizationTypes.h +58 -0
  21. include/axel/math/BoundingBoxUtils.h +54 -0
  22. include/axel/math/ContinuousCollisionDetection.h +48 -0
  23. include/axel/math/CoplanarityCheck.h +30 -0
  24. include/axel/math/EdgeEdgeDistance.h +31 -0
  25. include/axel/math/MeshHoleFilling.h +117 -0
  26. include/axel/math/PointTriangleProjection.h +34 -0
  27. include/axel/math/PointTriangleProjectionDefinitions.h +209 -0
  28. include/axel/math/RayTriangleIntersection.h +36 -0
  29. include/momentum/character/blend_shape.h +97 -0
  30. include/momentum/character/blend_shape_base.h +86 -0
  31. include/momentum/character/blend_shape_skinning.h +96 -0
  32. include/momentum/character/character.h +272 -0
  33. include/momentum/character/character_state.h +108 -0
  34. include/momentum/character/character_utility.h +128 -0
  35. include/momentum/character/collision_geometry.h +80 -0
  36. include/momentum/character/collision_geometry_state.h +130 -0
  37. include/momentum/character/fwd.h +262 -0
  38. include/momentum/character/inverse_parameter_transform.h +58 -0
  39. include/momentum/character/joint.h +82 -0
  40. include/momentum/character/joint_state.h +241 -0
  41. include/momentum/character/linear_skinning.h +139 -0
  42. include/momentum/character/locator.h +94 -0
  43. include/momentum/character/locator_state.h +43 -0
  44. include/momentum/character/marker.h +48 -0
  45. include/momentum/character/mesh_state.h +71 -0
  46. include/momentum/character/parameter_limits.h +144 -0
  47. include/momentum/character/parameter_transform.h +207 -0
  48. include/momentum/character/pose_shape.h +65 -0
  49. include/momentum/character/skeleton.h +85 -0
  50. include/momentum/character/skeleton_state.h +227 -0
  51. include/momentum/character/skeleton_utility.h +38 -0
  52. include/momentum/character/skin_weights.h +67 -0
  53. include/momentum/character/skinned_locator.h +80 -0
  54. include/momentum/character/types.h +202 -0
  55. include/momentum/character_sequence_solver/fwd.h +200 -0
  56. include/momentum/character_sequence_solver/model_parameters_sequence_error_function.h +65 -0
  57. include/momentum/character_sequence_solver/multipose_solver.h +65 -0
  58. include/momentum/character_sequence_solver/multipose_solver_function.h +82 -0
  59. include/momentum/character_sequence_solver/sequence_error_function.h +104 -0
  60. include/momentum/character_sequence_solver/sequence_solver.h +155 -0
  61. include/momentum/character_sequence_solver/sequence_solver_function.h +158 -0
  62. include/momentum/character_sequence_solver/state_sequence_error_function.h +117 -0
  63. include/momentum/character_sequence_solver/vertex_sequence_error_function.h +123 -0
  64. include/momentum/character_solver/aim_error_function.h +112 -0
  65. include/momentum/character_solver/collision_error_function.h +92 -0
  66. include/momentum/character_solver/collision_error_function_stateless.h +75 -0
  67. include/momentum/character_solver/constraint_error_function-inl.h +324 -0
  68. include/momentum/character_solver/constraint_error_function.h +248 -0
  69. include/momentum/character_solver/distance_error_function.h +77 -0
  70. include/momentum/character_solver/error_function_utils.h +60 -0
  71. include/momentum/character_solver/fixed_axis_error_function.h +139 -0
  72. include/momentum/character_solver/fwd.h +943 -0
  73. include/momentum/character_solver/gauss_newton_solver_qr.h +64 -0
  74. include/momentum/character_solver/height_error_function.h +176 -0
  75. include/momentum/character_solver/joint_to_joint_distance_error_function.h +111 -0
  76. include/momentum/character_solver/limit_error_function.h +57 -0
  77. include/momentum/character_solver/model_parameters_error_function.h +64 -0
  78. include/momentum/character_solver/normal_error_function.h +73 -0
  79. include/momentum/character_solver/orientation_error_function.h +74 -0
  80. include/momentum/character_solver/plane_error_function.h +102 -0
  81. include/momentum/character_solver/point_triangle_vertex_error_function.h +141 -0
  82. include/momentum/character_solver/pose_prior_error_function.h +80 -0
  83. include/momentum/character_solver/position_error_function.h +75 -0
  84. include/momentum/character_solver/projection_error_function.h +93 -0
  85. include/momentum/character_solver/simd_collision_error_function.h +99 -0
  86. include/momentum/character_solver/simd_normal_error_function.h +157 -0
  87. include/momentum/character_solver/simd_plane_error_function.h +164 -0
  88. include/momentum/character_solver/simd_position_error_function.h +165 -0
  89. include/momentum/character_solver/skeleton_error_function.h +151 -0
  90. include/momentum/character_solver/skeleton_solver_function.h +94 -0
  91. include/momentum/character_solver/skinned_locator_error_function.h +166 -0
  92. include/momentum/character_solver/skinned_locator_triangle_error_function.h +146 -0
  93. include/momentum/character_solver/skinning_weight_iterator.h +80 -0
  94. include/momentum/character_solver/state_error_function.h +119 -0
  95. include/momentum/character_solver/transform_pose.h +80 -0
  96. include/momentum/character_solver/trust_region_qr.h +80 -0
  97. include/momentum/character_solver/vertex_error_function.h +155 -0
  98. include/momentum/character_solver/vertex_projection_error_function.h +117 -0
  99. include/momentum/character_solver/vertex_vertex_distance_error_function.h +147 -0
  100. include/momentum/common/aligned.h +155 -0
  101. include/momentum/common/checks.h +27 -0
  102. include/momentum/common/exception.h +70 -0
  103. include/momentum/common/filesystem.h +20 -0
  104. include/momentum/common/fwd.h +27 -0
  105. include/momentum/common/log.h +173 -0
  106. include/momentum/common/log_channel.h +17 -0
  107. include/momentum/common/memory.h +71 -0
  108. include/momentum/common/profile.h +79 -0
  109. include/momentum/common/progress_bar.h +37 -0
  110. include/momentum/common/string.h +52 -0
  111. include/momentum/diff_ik/ceres_utility.h +73 -0
  112. include/momentum/diff_ik/fully_differentiable_body_ik.h +58 -0
  113. include/momentum/diff_ik/fully_differentiable_distance_error_function.h +69 -0
  114. include/momentum/diff_ik/fully_differentiable_motion_error_function.h +46 -0
  115. include/momentum/diff_ik/fully_differentiable_orientation_error_function.h +114 -0
  116. include/momentum/diff_ik/fully_differentiable_pose_prior_error_function.h +76 -0
  117. include/momentum/diff_ik/fully_differentiable_position_error_function.h +138 -0
  118. include/momentum/diff_ik/fully_differentiable_projection_error_function.h +65 -0
  119. include/momentum/diff_ik/fully_differentiable_skeleton_error_function.h +160 -0
  120. include/momentum/diff_ik/fully_differentiable_state_error_function.h +54 -0
  121. include/momentum/diff_ik/fwd.h +385 -0
  122. include/momentum/diff_ik/union_error_function.h +67 -0
  123. include/momentum/gui/rerun/eigen_adapters.h +70 -0
  124. include/momentum/gui/rerun/logger.h +102 -0
  125. include/momentum/gui/rerun/logging_redirect.h +27 -0
  126. include/momentum/io/character_io.h +98 -0
  127. include/momentum/io/common/gsl_utils.h +50 -0
  128. include/momentum/io/common/stream_utils.h +65 -0
  129. include/momentum/io/fbx/fbx_io.h +135 -0
  130. include/momentum/io/fbx/fbx_memory_stream.h +70 -0
  131. include/momentum/io/fbx/openfbx_loader.h +62 -0
  132. include/momentum/io/fbx/polygon_data.h +60 -0
  133. include/momentum/io/file_save_options.h +107 -0
  134. include/momentum/io/gltf/gltf_builder.h +141 -0
  135. include/momentum/io/gltf/gltf_io.h +149 -0
  136. include/momentum/io/gltf/utils/accessor_utils.h +299 -0
  137. include/momentum/io/gltf/utils/coordinate_utils.h +60 -0
  138. include/momentum/io/gltf/utils/json_utils.h +102 -0
  139. include/momentum/io/legacy_json/legacy_json_io.h +70 -0
  140. include/momentum/io/marker/c3d_io.h +30 -0
  141. include/momentum/io/marker/conversions.h +57 -0
  142. include/momentum/io/marker/coordinate_system.h +30 -0
  143. include/momentum/io/marker/marker_io.h +56 -0
  144. include/momentum/io/marker/trc_io.h +27 -0
  145. include/momentum/io/motion/mmo_io.h +97 -0
  146. include/momentum/io/shape/blend_shape_io.h +82 -0
  147. include/momentum/io/shape/pose_shape_io.h +21 -0
  148. include/momentum/io/skeleton/locator_io.h +41 -0
  149. include/momentum/io/skeleton/mppca_io.h +26 -0
  150. include/momentum/io/skeleton/parameter_limits_io.h +38 -0
  151. include/momentum/io/skeleton/parameter_transform_io.h +80 -0
  152. include/momentum/io/skeleton/parameters_io.h +20 -0
  153. include/momentum/io/skeleton/utility.h +67 -0
  154. include/momentum/io/urdf/urdf_io.h +26 -0
  155. include/momentum/io/usd/usd_io.h +36 -0
  156. include/momentum/marker_tracking/app_utils.h +64 -0
  157. include/momentum/marker_tracking/marker_tracker.h +221 -0
  158. include/momentum/marker_tracking/process_markers.h +58 -0
  159. include/momentum/marker_tracking/tracker_utils.h +99 -0
  160. include/momentum/math/constants.h +82 -0
  161. include/momentum/math/covariance_matrix.h +84 -0
  162. include/momentum/math/fmt_eigen.h +23 -0
  163. include/momentum/math/fwd.h +132 -0
  164. include/momentum/math/generalized_loss.h +61 -0
  165. include/momentum/math/intersection.h +32 -0
  166. include/momentum/math/mesh.h +84 -0
  167. include/momentum/math/mppca.h +67 -0
  168. include/momentum/math/online_householder_qr.h +516 -0
  169. include/momentum/math/random-inl.h +404 -0
  170. include/momentum/math/random.h +310 -0
  171. include/momentum/math/simd_generalized_loss.h +40 -0
  172. include/momentum/math/transform.h +229 -0
  173. include/momentum/math/types.h +461 -0
  174. include/momentum/math/utility.h +324 -0
  175. include/momentum/rasterizer/camera.h +453 -0
  176. include/momentum/rasterizer/fwd.h +102 -0
  177. include/momentum/rasterizer/geometry.h +83 -0
  178. include/momentum/rasterizer/image.h +18 -0
  179. include/momentum/rasterizer/rasterizer.h +583 -0
  180. include/momentum/rasterizer/tensor.h +140 -0
  181. include/momentum/rasterizer/text_rasterizer.h +89 -0
  182. include/momentum/rasterizer/utility.h +268 -0
  183. include/momentum/simd/simd.h +221 -0
  184. include/momentum/solver/fwd.h +131 -0
  185. include/momentum/solver/gauss_newton_solver.h +136 -0
  186. include/momentum/solver/gradient_descent_solver.h +65 -0
  187. include/momentum/solver/solver.h +155 -0
  188. include/momentum/solver/solver_function.h +126 -0
  189. include/momentum/solver/subset_gauss_newton_solver.h +109 -0
  190. include/rerun/archetypes/annotation_context.hpp +157 -0
  191. include/rerun/archetypes/arrows2d.hpp +271 -0
  192. include/rerun/archetypes/arrows3d.hpp +257 -0
  193. include/rerun/archetypes/asset3d.hpp +262 -0
  194. include/rerun/archetypes/asset_video.hpp +275 -0
  195. include/rerun/archetypes/bar_chart.hpp +261 -0
  196. include/rerun/archetypes/boxes2d.hpp +293 -0
  197. include/rerun/archetypes/boxes3d.hpp +369 -0
  198. include/rerun/archetypes/capsules3d.hpp +333 -0
  199. include/rerun/archetypes/clear.hpp +180 -0
  200. include/rerun/archetypes/depth_image.hpp +425 -0
  201. include/rerun/archetypes/ellipsoids3d.hpp +384 -0
  202. include/rerun/archetypes/encoded_image.hpp +250 -0
  203. include/rerun/archetypes/geo_line_strings.hpp +166 -0
  204. include/rerun/archetypes/geo_points.hpp +177 -0
  205. include/rerun/archetypes/graph_edges.hpp +152 -0
  206. include/rerun/archetypes/graph_nodes.hpp +206 -0
  207. include/rerun/archetypes/image.hpp +434 -0
  208. include/rerun/archetypes/instance_poses3d.hpp +221 -0
  209. include/rerun/archetypes/line_strips2d.hpp +289 -0
  210. include/rerun/archetypes/line_strips3d.hpp +270 -0
  211. include/rerun/archetypes/mesh3d.hpp +387 -0
  212. include/rerun/archetypes/pinhole.hpp +385 -0
  213. include/rerun/archetypes/points2d.hpp +333 -0
  214. include/rerun/archetypes/points3d.hpp +369 -0
  215. include/rerun/archetypes/recording_properties.hpp +132 -0
  216. include/rerun/archetypes/scalar.hpp +170 -0
  217. include/rerun/archetypes/scalars.hpp +153 -0
  218. include/rerun/archetypes/segmentation_image.hpp +305 -0
  219. include/rerun/archetypes/series_line.hpp +274 -0
  220. include/rerun/archetypes/series_lines.hpp +271 -0
  221. include/rerun/archetypes/series_point.hpp +265 -0
  222. include/rerun/archetypes/series_points.hpp +251 -0
  223. include/rerun/archetypes/tensor.hpp +213 -0
  224. include/rerun/archetypes/text_document.hpp +200 -0
  225. include/rerun/archetypes/text_log.hpp +211 -0
  226. include/rerun/archetypes/transform3d.hpp +925 -0
  227. include/rerun/archetypes/video_frame_reference.hpp +295 -0
  228. include/rerun/archetypes/view_coordinates.hpp +393 -0
  229. include/rerun/archetypes.hpp +43 -0
  230. include/rerun/arrow_utils.hpp +32 -0
  231. include/rerun/as_components.hpp +90 -0
  232. include/rerun/blueprint/archetypes/background.hpp +113 -0
  233. include/rerun/blueprint/archetypes/container_blueprint.hpp +259 -0
  234. include/rerun/blueprint/archetypes/dataframe_query.hpp +178 -0
  235. include/rerun/blueprint/archetypes/entity_behavior.hpp +130 -0
  236. include/rerun/blueprint/archetypes/force_center.hpp +115 -0
  237. include/rerun/blueprint/archetypes/force_collision_radius.hpp +141 -0
  238. include/rerun/blueprint/archetypes/force_link.hpp +136 -0
  239. include/rerun/blueprint/archetypes/force_many_body.hpp +124 -0
  240. include/rerun/blueprint/archetypes/force_position.hpp +132 -0
  241. include/rerun/blueprint/archetypes/line_grid3d.hpp +178 -0
  242. include/rerun/blueprint/archetypes/map_background.hpp +104 -0
  243. include/rerun/blueprint/archetypes/map_zoom.hpp +103 -0
  244. include/rerun/blueprint/archetypes/near_clip_plane.hpp +109 -0
  245. include/rerun/blueprint/archetypes/panel_blueprint.hpp +95 -0
  246. include/rerun/blueprint/archetypes/plot_legend.hpp +118 -0
  247. include/rerun/blueprint/archetypes/scalar_axis.hpp +116 -0
  248. include/rerun/blueprint/archetypes/tensor_scalar_mapping.hpp +146 -0
  249. include/rerun/blueprint/archetypes/tensor_slice_selection.hpp +167 -0
  250. include/rerun/blueprint/archetypes/tensor_view_fit.hpp +95 -0
  251. include/rerun/blueprint/archetypes/view_blueprint.hpp +170 -0
  252. include/rerun/blueprint/archetypes/view_contents.hpp +142 -0
  253. include/rerun/blueprint/archetypes/viewport_blueprint.hpp +200 -0
  254. include/rerun/blueprint/archetypes/visible_time_ranges.hpp +116 -0
  255. include/rerun/blueprint/archetypes/visual_bounds2d.hpp +109 -0
  256. include/rerun/blueprint/archetypes/visualizer_overrides.hpp +113 -0
  257. include/rerun/blueprint/archetypes.hpp +29 -0
  258. include/rerun/blueprint/components/active_tab.hpp +82 -0
  259. include/rerun/blueprint/components/apply_latest_at.hpp +79 -0
  260. include/rerun/blueprint/components/auto_layout.hpp +77 -0
  261. include/rerun/blueprint/components/auto_views.hpp +77 -0
  262. include/rerun/blueprint/components/background_kind.hpp +66 -0
  263. include/rerun/blueprint/components/column_share.hpp +78 -0
  264. include/rerun/blueprint/components/component_column_selector.hpp +81 -0
  265. include/rerun/blueprint/components/container_kind.hpp +65 -0
  266. include/rerun/blueprint/components/corner2d.hpp +64 -0
  267. include/rerun/blueprint/components/enabled.hpp +77 -0
  268. include/rerun/blueprint/components/filter_by_range.hpp +74 -0
  269. include/rerun/blueprint/components/filter_is_not_null.hpp +77 -0
  270. include/rerun/blueprint/components/force_distance.hpp +82 -0
  271. include/rerun/blueprint/components/force_iterations.hpp +82 -0
  272. include/rerun/blueprint/components/force_strength.hpp +82 -0
  273. include/rerun/blueprint/components/grid_columns.hpp +78 -0
  274. include/rerun/blueprint/components/grid_spacing.hpp +78 -0
  275. include/rerun/blueprint/components/included_content.hpp +86 -0
  276. include/rerun/blueprint/components/lock_range_during_zoom.hpp +82 -0
  277. include/rerun/blueprint/components/map_provider.hpp +64 -0
  278. include/rerun/blueprint/components/near_clip_plane.hpp +82 -0
  279. include/rerun/blueprint/components/panel_state.hpp +61 -0
  280. include/rerun/blueprint/components/query_expression.hpp +89 -0
  281. include/rerun/blueprint/components/root_container.hpp +77 -0
  282. include/rerun/blueprint/components/row_share.hpp +78 -0
  283. include/rerun/blueprint/components/selected_columns.hpp +76 -0
  284. include/rerun/blueprint/components/tensor_dimension_index_slider.hpp +90 -0
  285. include/rerun/blueprint/components/timeline_name.hpp +76 -0
  286. include/rerun/blueprint/components/view_class.hpp +76 -0
  287. include/rerun/blueprint/components/view_fit.hpp +61 -0
  288. include/rerun/blueprint/components/view_maximized.hpp +79 -0
  289. include/rerun/blueprint/components/view_origin.hpp +81 -0
  290. include/rerun/blueprint/components/viewer_recommendation_hash.hpp +82 -0
  291. include/rerun/blueprint/components/visible_time_range.hpp +77 -0
  292. include/rerun/blueprint/components/visual_bounds2d.hpp +74 -0
  293. include/rerun/blueprint/components/visualizer_override.hpp +86 -0
  294. include/rerun/blueprint/components/zoom_level.hpp +78 -0
  295. include/rerun/blueprint/components.hpp +41 -0
  296. include/rerun/blueprint/datatypes/component_column_selector.hpp +61 -0
  297. include/rerun/blueprint/datatypes/filter_by_range.hpp +59 -0
  298. include/rerun/blueprint/datatypes/filter_is_not_null.hpp +61 -0
  299. include/rerun/blueprint/datatypes/selected_columns.hpp +62 -0
  300. include/rerun/blueprint/datatypes/tensor_dimension_index_slider.hpp +63 -0
  301. include/rerun/blueprint/datatypes.hpp +9 -0
  302. include/rerun/c/arrow_c_data_interface.h +111 -0
  303. include/rerun/c/compiler_utils.h +10 -0
  304. include/rerun/c/rerun.h +627 -0
  305. include/rerun/c/sdk_info.h +28 -0
  306. include/rerun/collection.hpp +496 -0
  307. include/rerun/collection_adapter.hpp +43 -0
  308. include/rerun/collection_adapter_builtins.hpp +138 -0
  309. include/rerun/compiler_utils.hpp +61 -0
  310. include/rerun/component_batch.hpp +163 -0
  311. include/rerun/component_column.hpp +111 -0
  312. include/rerun/component_descriptor.hpp +142 -0
  313. include/rerun/component_type.hpp +35 -0
  314. include/rerun/components/aggregation_policy.hpp +76 -0
  315. include/rerun/components/albedo_factor.hpp +74 -0
  316. include/rerun/components/annotation_context.hpp +102 -0
  317. include/rerun/components/axis_length.hpp +74 -0
  318. include/rerun/components/blob.hpp +73 -0
  319. include/rerun/components/class_id.hpp +71 -0
  320. include/rerun/components/clear_is_recursive.hpp +75 -0
  321. include/rerun/components/color.hpp +99 -0
  322. include/rerun/components/colormap.hpp +99 -0
  323. include/rerun/components/depth_meter.hpp +84 -0
  324. include/rerun/components/draw_order.hpp +79 -0
  325. include/rerun/components/entity_path.hpp +83 -0
  326. include/rerun/components/fill_mode.hpp +72 -0
  327. include/rerun/components/fill_ratio.hpp +79 -0
  328. include/rerun/components/gamma_correction.hpp +80 -0
  329. include/rerun/components/geo_line_string.hpp +63 -0
  330. include/rerun/components/graph_edge.hpp +75 -0
  331. include/rerun/components/graph_node.hpp +79 -0
  332. include/rerun/components/graph_type.hpp +57 -0
  333. include/rerun/components/half_size2d.hpp +91 -0
  334. include/rerun/components/half_size3d.hpp +95 -0
  335. include/rerun/components/image_buffer.hpp +86 -0
  336. include/rerun/components/image_format.hpp +84 -0
  337. include/rerun/components/image_plane_distance.hpp +77 -0
  338. include/rerun/components/interactive.hpp +76 -0
  339. include/rerun/components/keypoint_id.hpp +74 -0
  340. include/rerun/components/lat_lon.hpp +89 -0
  341. include/rerun/components/length.hpp +77 -0
  342. include/rerun/components/line_strip2d.hpp +73 -0
  343. include/rerun/components/line_strip3d.hpp +73 -0
  344. include/rerun/components/magnification_filter.hpp +63 -0
  345. include/rerun/components/marker_shape.hpp +82 -0
  346. include/rerun/components/marker_size.hpp +74 -0
  347. include/rerun/components/media_type.hpp +157 -0
  348. include/rerun/components/name.hpp +83 -0
  349. include/rerun/components/opacity.hpp +77 -0
  350. include/rerun/components/pinhole_projection.hpp +94 -0
  351. include/rerun/components/plane3d.hpp +75 -0
  352. include/rerun/components/pose_rotation_axis_angle.hpp +73 -0
  353. include/rerun/components/pose_rotation_quat.hpp +71 -0
  354. include/rerun/components/pose_scale3d.hpp +102 -0
  355. include/rerun/components/pose_transform_mat3x3.hpp +87 -0
  356. include/rerun/components/pose_translation3d.hpp +96 -0
  357. include/rerun/components/position2d.hpp +86 -0
  358. include/rerun/components/position3d.hpp +90 -0
  359. include/rerun/components/radius.hpp +98 -0
  360. include/rerun/components/range1d.hpp +75 -0
  361. include/rerun/components/resolution.hpp +88 -0
  362. include/rerun/components/rotation_axis_angle.hpp +72 -0
  363. include/rerun/components/rotation_quat.hpp +71 -0
  364. include/rerun/components/scalar.hpp +76 -0
  365. include/rerun/components/scale3d.hpp +102 -0
  366. include/rerun/components/series_visible.hpp +76 -0
  367. include/rerun/components/show_labels.hpp +79 -0
  368. include/rerun/components/stroke_width.hpp +74 -0
  369. include/rerun/components/tensor_data.hpp +94 -0
  370. include/rerun/components/tensor_dimension_index_selection.hpp +77 -0
  371. include/rerun/components/tensor_height_dimension.hpp +71 -0
  372. include/rerun/components/tensor_width_dimension.hpp +71 -0
  373. include/rerun/components/texcoord2d.hpp +101 -0
  374. include/rerun/components/text.hpp +83 -0
  375. include/rerun/components/text_log_level.hpp +110 -0
  376. include/rerun/components/timestamp.hpp +76 -0
  377. include/rerun/components/transform_mat3x3.hpp +92 -0
  378. include/rerun/components/transform_relation.hpp +66 -0
  379. include/rerun/components/translation3d.hpp +96 -0
  380. include/rerun/components/triangle_indices.hpp +85 -0
  381. include/rerun/components/value_range.hpp +78 -0
  382. include/rerun/components/vector2d.hpp +92 -0
  383. include/rerun/components/vector3d.hpp +96 -0
  384. include/rerun/components/video_timestamp.hpp +120 -0
  385. include/rerun/components/view_coordinates.hpp +346 -0
  386. include/rerun/components/visible.hpp +74 -0
  387. include/rerun/components.hpp +77 -0
  388. include/rerun/config.hpp +52 -0
  389. include/rerun/datatypes/angle.hpp +76 -0
  390. include/rerun/datatypes/annotation_info.hpp +76 -0
  391. include/rerun/datatypes/blob.hpp +67 -0
  392. include/rerun/datatypes/bool.hpp +57 -0
  393. include/rerun/datatypes/channel_datatype.hpp +87 -0
  394. include/rerun/datatypes/class_description.hpp +92 -0
  395. include/rerun/datatypes/class_description_map_elem.hpp +69 -0
  396. include/rerun/datatypes/class_id.hpp +62 -0
  397. include/rerun/datatypes/color_model.hpp +68 -0
  398. include/rerun/datatypes/dvec2d.hpp +76 -0
  399. include/rerun/datatypes/entity_path.hpp +60 -0
  400. include/rerun/datatypes/float32.hpp +62 -0
  401. include/rerun/datatypes/float64.hpp +62 -0
  402. include/rerun/datatypes/image_format.hpp +107 -0
  403. include/rerun/datatypes/keypoint_id.hpp +63 -0
  404. include/rerun/datatypes/keypoint_pair.hpp +65 -0
  405. include/rerun/datatypes/mat3x3.hpp +105 -0
  406. include/rerun/datatypes/mat4x4.hpp +119 -0
  407. include/rerun/datatypes/pixel_format.hpp +142 -0
  408. include/rerun/datatypes/plane3d.hpp +60 -0
  409. include/rerun/datatypes/quaternion.hpp +110 -0
  410. include/rerun/datatypes/range1d.hpp +59 -0
  411. include/rerun/datatypes/range2d.hpp +55 -0
  412. include/rerun/datatypes/rgba32.hpp +94 -0
  413. include/rerun/datatypes/rotation_axis_angle.hpp +67 -0
  414. include/rerun/datatypes/tensor_buffer.hpp +529 -0
  415. include/rerun/datatypes/tensor_data.hpp +100 -0
  416. include/rerun/datatypes/tensor_dimension_index_selection.hpp +58 -0
  417. include/rerun/datatypes/tensor_dimension_selection.hpp +56 -0
  418. include/rerun/datatypes/time_int.hpp +62 -0
  419. include/rerun/datatypes/time_range.hpp +55 -0
  420. include/rerun/datatypes/time_range_boundary.hpp +175 -0
  421. include/rerun/datatypes/uint16.hpp +62 -0
  422. include/rerun/datatypes/uint32.hpp +62 -0
  423. include/rerun/datatypes/uint64.hpp +62 -0
  424. include/rerun/datatypes/utf8.hpp +76 -0
  425. include/rerun/datatypes/utf8pair.hpp +62 -0
  426. include/rerun/datatypes/uuid.hpp +60 -0
  427. include/rerun/datatypes/uvec2d.hpp +76 -0
  428. include/rerun/datatypes/uvec3d.hpp +80 -0
  429. include/rerun/datatypes/uvec4d.hpp +59 -0
  430. include/rerun/datatypes/vec2d.hpp +76 -0
  431. include/rerun/datatypes/vec3d.hpp +80 -0
  432. include/rerun/datatypes/vec4d.hpp +84 -0
  433. include/rerun/datatypes/video_timestamp.hpp +67 -0
  434. include/rerun/datatypes/view_coordinates.hpp +87 -0
  435. include/rerun/datatypes/visible_time_range.hpp +57 -0
  436. include/rerun/datatypes.hpp +51 -0
  437. include/rerun/demo_utils.hpp +75 -0
  438. include/rerun/entity_path.hpp +20 -0
  439. include/rerun/error.hpp +180 -0
  440. include/rerun/half.hpp +10 -0
  441. include/rerun/image_utils.hpp +187 -0
  442. include/rerun/indicator_component.hpp +59 -0
  443. include/rerun/loggable.hpp +54 -0
  444. include/rerun/recording_stream.hpp +960 -0
  445. include/rerun/rerun_sdk_export.hpp +25 -0
  446. include/rerun/result.hpp +86 -0
  447. include/rerun/rotation3d.hpp +33 -0
  448. include/rerun/sdk_info.hpp +20 -0
  449. include/rerun/spawn.hpp +21 -0
  450. include/rerun/spawn_options.hpp +57 -0
  451. include/rerun/string_utils.hpp +16 -0
  452. include/rerun/third_party/cxxopts.hpp +2198 -0
  453. include/rerun/time_column.hpp +288 -0
  454. include/rerun/timeline.hpp +38 -0
  455. include/rerun/type_traits.hpp +40 -0
  456. include/rerun.hpp +86 -0
  457. lib/cmake/axel/axel-config.cmake +45 -0
  458. lib/cmake/axel/axelTargets-release.cmake +19 -0
  459. lib/cmake/axel/axelTargets.cmake +108 -0
  460. lib/cmake/momentum/FindFbxSdk.cmake +115 -0
  461. lib/cmake/momentum/Findre2.cmake +52 -0
  462. lib/cmake/momentum/momentum-config.cmake +67 -0
  463. lib/cmake/momentum/momentumTargets-release.cmake +259 -0
  464. lib/cmake/momentum/momentumTargets.cmake +385 -0
  465. lib/cmake/rerun_sdk/rerun_sdkConfig.cmake +70 -0
  466. lib/cmake/rerun_sdk/rerun_sdkConfigVersion.cmake +83 -0
  467. lib/cmake/rerun_sdk/rerun_sdkTargets-release.cmake +19 -0
  468. lib/cmake/rerun_sdk/rerun_sdkTargets.cmake +108 -0
  469. lib/libarrow.a +0 -0
  470. lib/libarrow_bundled_dependencies.a +0 -0
  471. lib/libaxel.a +0 -0
  472. lib/libmomentum_app_utils.a +0 -0
  473. lib/libmomentum_character.a +0 -0
  474. lib/libmomentum_character_sequence_solver.a +0 -0
  475. lib/libmomentum_character_solver.a +0 -0
  476. lib/libmomentum_common.a +0 -0
  477. lib/libmomentum_diff_ik.a +0 -0
  478. lib/libmomentum_io.a +0 -0
  479. lib/libmomentum_io_common.a +0 -0
  480. lib/libmomentum_io_fbx.a +0 -0
  481. lib/libmomentum_io_gltf.a +0 -0
  482. lib/libmomentum_io_legacy_json.a +0 -0
  483. lib/libmomentum_io_marker.a +0 -0
  484. lib/libmomentum_io_motion.a +0 -0
  485. lib/libmomentum_io_shape.a +0 -0
  486. lib/libmomentum_io_skeleton.a +0 -0
  487. lib/libmomentum_io_urdf.a +0 -0
  488. lib/libmomentum_marker_tracker.a +0 -0
  489. lib/libmomentum_math.a +0 -0
  490. lib/libmomentum_online_qr.a +0 -0
  491. lib/libmomentum_process_markers.a +0 -0
  492. lib/libmomentum_rerun.a +0 -0
  493. lib/libmomentum_simd_constraints.a +0 -0
  494. lib/libmomentum_simd_generalized_loss.a +0 -0
  495. lib/libmomentum_skeleton.a +0 -0
  496. lib/libmomentum_solver.a +0 -0
  497. lib/librerun_c__macos_arm64.a +0 -0
  498. lib/librerun_sdk.a +0 -0
  499. pymomentum/axel.cpython-312-darwin.so +0 -0
  500. pymomentum/backend/__init__.py +16 -0
  501. pymomentum/backend/skel_state_backend.py +631 -0
  502. pymomentum/backend/trs_backend.py +889 -0
  503. pymomentum/backend/utils.py +224 -0
  504. pymomentum/geometry.cpython-312-darwin.so +0 -0
  505. pymomentum/marker_tracking.cpython-312-darwin.so +0 -0
  506. pymomentum/quaternion.py +740 -0
  507. pymomentum/skel_state.py +514 -0
  508. pymomentum/solver.cpython-312-darwin.so +0 -0
  509. pymomentum/solver2.cpython-312-darwin.so +0 -0
  510. pymomentum/torch/character.py +868 -0
  511. pymomentum/torch/parameter_limits.py +494 -0
  512. pymomentum/torch/utility.py +20 -0
  513. pymomentum/trs.py +535 -0
  514. pymomentum_cpu-0.1.93.post0.dist-info/METADATA +126 -0
  515. pymomentum_cpu-0.1.93.post0.dist-info/RECORD +517 -0
  516. pymomentum_cpu-0.1.93.post0.dist-info/WHEEL +5 -0
  517. pymomentum_cpu-0.1.93.post0.dist-info/licenses/LICENSE +21 -0
include/axel/Bvh.h ADDED
@@ -0,0 +1,708 @@
1
+ /*
2
+ * Portions Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ /* which bore the following notice:
9
+ Copyright (c) 2012 Brandon Pelfrey
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
11
+ associated documentation files (the "Software"), to deal in the Software without restriction,
12
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
13
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
14
+ furnished to do so, subject to the following conditions: The above copyright notice and this
15
+ permission notice shall be included in all copies or substantial portions of the Software. THE
16
+ SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
17
+ LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+ */
22
+
23
+ #pragma once
24
+
25
+ #include <vector>
26
+
27
+ #include "axel/BvhBase.h"
28
+ #include "axel/BvhCommon.h"
29
+ #include "axel/common/Types.h"
30
+ #include "axel/common/VectorizationTypes.h"
31
+
32
+ // BVH based on https://github.com/brandonpelfrey/Fast-BVH
33
+
34
+ namespace axel {
35
+
36
+ template <typename S>
37
+ struct BvhFlatNode {
38
+ BoundingBox<S> bbox;
39
+ uint32_t start{}, nPrims{}, rightOffset{};
40
+
41
+ [[nodiscard]] bool isLeaf() const {
42
+ return rightOffset == 0;
43
+ }
44
+
45
+ [[nodiscard]] uint32_t getLeftIndex(uint32_t index) const {
46
+ return index + 1;
47
+ }
48
+
49
+ [[nodiscard]] uint32_t getRightIndex(uint32_t index) const {
50
+ return index + rightOffset;
51
+ }
52
+
53
+ // Invokes a callback function for each primitive within the node. If the callback function
54
+ // returns a boolean, a return value of true indicates that the iteration should stop, while
55
+ // false allows it to continue.
56
+ template <typename Callback>
57
+ auto eachPrimitive(std::vector<BoundingBox<S>>& primitives, Callback&& callback);
58
+
59
+ // Invokes a callback function for each primitive within the node. If the callback function
60
+ // returns a boolean, a return value of true indicates that the iteration should stop, while
61
+ // false allows it to continue.
62
+ template <typename Callback>
63
+ auto eachPrimitive(const std::vector<BoundingBox<S>>& primitives, Callback&& callback) const;
64
+
65
+ // Invokes a callback function for each primitive within the node starting from a specified
66
+ // index. If the callback function returns a boolean, a return value of true indicates that the
67
+ // iteration should stop, while false allows it to continue.
68
+ template <typename Callback>
69
+ auto
70
+ eachPrimitive(std::vector<BoundingBox<S>>& primitives, uint32_t startIndex, Callback&& callback);
71
+
72
+ // Invokes a callback function for each primitive within the node starting from a specified
73
+ // index. If the callback function returns a boolean, a return value of true indicates that the
74
+ // iteration should stop, while false allows it to continue.
75
+ template <typename Callback>
76
+ auto eachPrimitive(
77
+ const std::vector<BoundingBox<S>>& primitives,
78
+ uint32_t startIndex,
79
+ Callback&& callback) const;
80
+ };
81
+
82
+ template <typename S, size_t LeafCapacity = 1>
83
+ class Bvh final : public BvhBase<S> {
84
+ public:
85
+ using BvhType = Bvh<S, LeafCapacity>;
86
+ using Scalar = S;
87
+ using QueryBuffer = typename BvhBase<S>::QueryBuffer;
88
+ static constexpr size_t kLeafCapacity = LeafCapacity;
89
+ static constexpr size_t kMaxStackDepth = 64;
90
+
91
+ Bvh() = default;
92
+ explicit Bvh(const std::vector<BoundingBox<S>>& buildPrimitives);
93
+ ~Bvh() override = default;
94
+
95
+ Bvh(const Bvh&) = default;
96
+ Bvh& operator=(const Bvh&) = default;
97
+
98
+ Bvh(Bvh&&) = default;
99
+ Bvh& operator=(Bvh&&) = default;
100
+
101
+ // Sets the bounding boxes of the leaf nodes of the BVH. This function calls build() internally,
102
+ // so there's no need to call build() again after setting the bounding boxes.
103
+ void setBoundingBoxes(const std::vector<BoundingBox<S>>& bboxes) override;
104
+
105
+ // Rebuilds the BVH based on the bounding boxes previously set via setBoundingBoxes(). This
106
+ // function is useful when the bounding boxes, accessed via getPrimitives(), are updated and a
107
+ // rebuild of the tree is needed.
108
+ void build();
109
+
110
+ [[nodiscard]] std::vector<BoundingBox<S>>& getPrimitives();
111
+
112
+ [[nodiscard]] const std::vector<BoundingBox<S>>& getPrimitives() const;
113
+
114
+ // Refits the tree to account for changes in the bounding boxes of leaf nodes. This is achieved
115
+ // by updating the entire tree in a bottom-up manner to ensure accurate collision detection.
116
+ void refit();
117
+
118
+ // Queries the BVH for bounding boxes intersecting with the specified box.
119
+ [[nodiscard]] std::vector<uint32_t> query(const BoundingBox<S>& box) const override;
120
+
121
+ // Overloaded query function that stores intersecting bounding boxes in a provided buffer,
122
+ // returning the count.
123
+ uint32_t query(const BoundingBox<S>& box, QueryBuffer& hits) const override;
124
+
125
+ // Queries the BVH for bounding boxes intersected by a ray specified by its origin and direction.
126
+ [[nodiscard]] std::vector<uint32_t> query(
127
+ const Eigen::Vector3<S>& origin,
128
+ const Eigen::Vector3<S>& direction) const override;
129
+
130
+ // Queries the BVH for the closest point on the surface to a specified query point.
131
+ template <typename ClosestSurfacePointFunc>
132
+ [[nodiscard]] ClosestSurfacePointResult<S> queryClosestSurfacePoint(
133
+ const Eigen::Vector3<S>& query,
134
+ ClosestSurfacePointFunc&& func) const;
135
+ template <typename ClosestSurfacePointFunc>
136
+ [[nodiscard]] ClosestSurfacePointResult<S> queryClosestSurfacePointPacket(
137
+ const Eigen::Vector3<S>& query,
138
+ ClosestSurfacePointFunc&& func) const;
139
+
140
+ // Queries the BVH for the closest hit along a ray within a specified range of t-values.
141
+ template <typename ReturnType, typename RayPrimitiveIntersector>
142
+ [[nodiscard]] ReturnType rayQueryClosestHit(
143
+ const Eigen::Vector3<S>& origin,
144
+ const Eigen::Vector3<S>& direction,
145
+ S minT,
146
+ S maxT,
147
+ RayPrimitiveIntersector&& func) const;
148
+
149
+ // Queries the BVH for any hit along a ray within a specified range of t-values, returning true if
150
+ // such an intersection exists, or false otherwise.
151
+ template <typename RayPrimitiveIntersector>
152
+ [[nodiscard]] bool rayQueryAnyHit(
153
+ const Eigen::Vector3<S>& origin,
154
+ const Eigen::Vector3<S>& direction,
155
+ S minT,
156
+ S maxT,
157
+ RayPrimitiveIntersector&& func) const;
158
+
159
+ // Invokes the provided callback function for each pair of overlapping bounding boxes within this
160
+ // BVH. The callback function should return false if the traversal should stop, or false
161
+ // otherwise.
162
+ template <typename Callback>
163
+ void traverseOverlappingPairs(Callback&& func) const;
164
+
165
+ // Invokes the provided callback function for each pair of overlapping bounding boxes between this
166
+ // BVH and another BVH. Note that the indices passed to the callback are relative to each BVH's
167
+ // own primitive list. The callback function should return false if the traversal should stop,
168
+ // or false otherwise.
169
+ template <typename Callback>
170
+ void traverseOverlappingPairs(const BvhType& other, Callback&& func) const;
171
+
172
+ // Returns the total number of nodes in the BVH.
173
+ [[nodiscard]] Size getNodeCount() const;
174
+
175
+ // Returns the total number of primitives (bounding boxes) in the BVH.
176
+ [[nodiscard]] Size getPrimitiveCount() const override;
177
+
178
+ // Checks if all bounding boxes in the BVH tree are correctly structured.
179
+ // This method is mainly used for debugging purposes.
180
+ [[nodiscard]] bool checkBoundingBoxes() const;
181
+
182
+ private:
183
+ // This bool is used to select either a scalar or a packet-based callback type.
184
+ template <bool IsPacket, bool NeedBarycentric, typename ClosestSurfacePointFunc>
185
+ S queryClosestHelper(
186
+ uint32_t nodeIdx,
187
+ const Eigen::Vector3<S>& query,
188
+ const ClosestSurfacePointFunc& func,
189
+ S sqrDist,
190
+ ClosestSurfacePointResult<S>& result) const;
191
+
192
+ std::vector<BvhFlatNode<S>> flatTree_;
193
+ std::vector<BoundingBox<S>> buildPrimitives_;
194
+
195
+ Size nodeCount_{0};
196
+ };
197
+
198
+ using Bvhf = Bvh<float, 1>;
199
+ using Bvhd = Bvh<double, 1>;
200
+
201
+ extern template class Bvh<float, 1>;
202
+ extern template class Bvh<double, 1>;
203
+ extern template class Bvh<float, kNativeLaneWidth<float>>;
204
+ extern template class Bvh<double, kNativeLaneWidth<double>>;
205
+
206
+ } // namespace axel
207
+
208
+ #include <axel/Checks.h>
209
+
210
+ //------------------------------------------------------------------------------
211
+ // Implementation
212
+ //------------------------------------------------------------------------------
213
+
214
+ namespace axel {
215
+
216
+ template <typename S>
217
+ template <typename Callback>
218
+ auto BvhFlatNode<S>::eachPrimitive(std::vector<BoundingBox<S>>& primitives, Callback&& callback) {
219
+ static_assert(
220
+ std::is_invocable_v<Callback, BoundingBox<S>&>,
221
+ "Callback function must be invocable with a BoundingBox<S>& argument");
222
+
223
+ if constexpr (std::is_same_v<bool, std::invoke_result_t<Callback, BoundingBox<S>&>>) {
224
+ for (uint32_t i = start; i < start + nPrims; ++i) {
225
+ if (!callback(primitives[i])) {
226
+ return false;
227
+ }
228
+ }
229
+ return true;
230
+ } else {
231
+ for (uint32_t i = start; i < start + nPrims; ++i) {
232
+ callback(primitives[i]);
233
+ }
234
+ }
235
+ }
236
+
237
+ template <typename S>
238
+ template <typename Callback>
239
+ auto BvhFlatNode<S>::eachPrimitive(
240
+ const std::vector<BoundingBox<S>>& primitives,
241
+ Callback&& callback) const {
242
+ static_assert(
243
+ std::is_invocable_v<Callback, const BoundingBox<S>&>,
244
+ "Callback function must be invocable with a const BoundingBox<S>& argument");
245
+
246
+ if constexpr (std::is_same_v<bool, std::invoke_result_t<Callback, const BoundingBox<S>&>>) {
247
+ for (uint32_t i = start; i < start + nPrims; ++i) {
248
+ if (!callback(primitives[i])) {
249
+ return false;
250
+ }
251
+ }
252
+ return true;
253
+ } else {
254
+ for (uint32_t i = start; i < start + nPrims; ++i) {
255
+ callback(primitives[i]);
256
+ }
257
+ }
258
+ }
259
+
260
+ template <typename S>
261
+ template <typename Callback>
262
+ auto BvhFlatNode<S>::eachPrimitive(
263
+ std::vector<BoundingBox<S>>& primitives,
264
+ uint32_t startIndex,
265
+ Callback&& callback) {
266
+ static_assert(
267
+ std::is_invocable_v<Callback, BoundingBox<S>&>,
268
+ "Callback function must be invocable with a BoundingBox<S>& argument");
269
+
270
+ if constexpr (std::is_same_v<bool, std::invoke_result_t<Callback, BoundingBox<S>&>>) {
271
+ for (uint32_t i = start + startIndex; i < start + nPrims; ++i) {
272
+ if (!callback(primitives[i])) {
273
+ return false;
274
+ }
275
+ }
276
+ return true;
277
+ } else {
278
+ for (uint32_t i = start + startIndex; i < start + nPrims; ++i) {
279
+ callback(primitives[i]);
280
+ }
281
+ }
282
+ }
283
+
284
+ template <typename S>
285
+ template <typename Callback>
286
+ auto BvhFlatNode<S>::eachPrimitive(
287
+ const std::vector<BoundingBox<S>>& primitives,
288
+ uint32_t startIndex,
289
+ Callback&& callback) const {
290
+ static_assert(
291
+ std::is_invocable_v<Callback, const BoundingBox<S>&>,
292
+ "Callback function must be invocable with a const BoundingBox<S>& argument");
293
+
294
+ if constexpr (std::is_same_v<bool, std::invoke_result_t<Callback, const BoundingBox<S>&>>) {
295
+ for (uint32_t i = start + startIndex; i < start + nPrims; ++i) {
296
+ if (!callback(primitives[i])) {
297
+ return false;
298
+ }
299
+ }
300
+ return true;
301
+ } else {
302
+ for (uint32_t i = start + startIndex; i < start + nPrims; ++i) {
303
+ callback(primitives[i]);
304
+ }
305
+ }
306
+ }
307
+
308
+ namespace {
309
+
310
+ template <typename S, typename Callback>
311
+ bool traverseCollision(
312
+ const std::vector<BvhFlatNode<S>>& nodesA,
313
+ const Size indexA,
314
+ const std::vector<BoundingBox<S>>& leafAabbsA,
315
+ const std::vector<BvhFlatNode<S>>& nodesB,
316
+ const Size indexB,
317
+ const std::vector<BoundingBox<S>>& leafAabbsB,
318
+ Callback&& func) {
319
+ // Retrieve the current nodes from both trees
320
+ const auto& nodeA = nodesA[indexA];
321
+ const auto& nodeB = nodesB[indexB];
322
+
323
+ // Early exit if bounding boxes of the current nodes do not intersect
324
+ if (!nodeA.bbox.intersects(nodeB.bbox)) {
325
+ return false;
326
+ }
327
+
328
+ // Handle leaf-leaf intersection by checking all bounding boxes at the leaf nodes
329
+ if (nodeA.isLeaf() && nodeB.isLeaf()) {
330
+ nodeA.eachPrimitive(leafAabbsA, [&](const BoundingBox<S>& aabbA) -> bool {
331
+ return nodeB.eachPrimitive(leafAabbsB, [&](const BoundingBox<S>& aabbB) -> bool {
332
+ return func(aabbA.id, aabbB.id); // true means continue traversal
333
+ }); // true means continue traversal
334
+ });
335
+ return false;
336
+ }
337
+
338
+ // Determine which BVH to descend based on leaf status or bounding box size
339
+ const bool descendA = nodeB.isLeaf() ||
340
+ (!nodeA.isLeaf() && (nodeA.bbox.squaredVolume() > nodeB.bbox.squaredVolume()));
341
+
342
+ // Recursively traverse the chosen BVH and its sibling
343
+ const Size nextIndexA1 = descendA ? nodeA.getLeftIndex(indexA) : indexA;
344
+ const Size nextIndexA2 = descendA ? nodeA.getRightIndex(indexA) : indexA;
345
+ const Size nextIndexB1 = descendA ? indexB : nodeB.getLeftIndex(indexB);
346
+ const Size nextIndexB2 = descendA ? indexB : nodeB.getRightIndex(indexB);
347
+ return traverseCollision(
348
+ nodesA,
349
+ nextIndexA1,
350
+ leafAabbsA,
351
+ nodesB,
352
+ nextIndexB1,
353
+ leafAabbsB,
354
+ std::forward<Callback>(func)) ||
355
+ traverseCollision(
356
+ nodesA,
357
+ nextIndexA2,
358
+ leafAabbsA,
359
+ nodesB,
360
+ nextIndexB2,
361
+ leafAabbsB,
362
+ std::forward<Callback>(func));
363
+ }
364
+
365
+ template <typename S, typename Callback>
366
+ bool traverseSelfCollision(
367
+ const std::vector<BvhFlatNode<S>>& nodes,
368
+ const Size index,
369
+ const std::vector<BoundingBox<S>>& leafAabbs,
370
+ Callback&& func) {
371
+ const auto& node = nodes[index];
372
+
373
+ if (node.isLeaf()) {
374
+ return false;
375
+ }
376
+
377
+ const Size leftChildIndex = node.getLeftIndex(index);
378
+ if (traverseSelfCollision(nodes, leftChildIndex, leafAabbs, std::forward<Callback>(func))) {
379
+ return true;
380
+ }
381
+
382
+ const Size rightChildIndex = node.getRightIndex(index);
383
+ if (traverseSelfCollision(nodes, rightChildIndex, leafAabbs, std::forward<Callback>(func))) {
384
+ return true;
385
+ }
386
+
387
+ if (traverseCollision(
388
+ nodes,
389
+ leftChildIndex,
390
+ leafAabbs,
391
+ nodes,
392
+ rightChildIndex,
393
+ leafAabbs,
394
+ std::forward<Callback>(func))) {
395
+ return true;
396
+ }
397
+
398
+ return false;
399
+ }
400
+
401
+ } // namespace
402
+
403
+ template <typename S, size_t LeafCapacity>
404
+ template <typename ClosestSurfacePointFunc>
405
+ [[nodiscard]] ClosestSurfacePointResult<S> Bvh<S, LeafCapacity>::queryClosestSurfacePoint(
406
+ const Eigen::Vector3<S>& query,
407
+ ClosestSurfacePointFunc&& func) const {
408
+ // TODO(nemanjab): Implement this without recursion. It should be faster.
409
+ ClosestSurfacePointResult<S> res{};
410
+ if constexpr (std::is_invocable_r_v<
411
+ void,
412
+ ClosestSurfacePointFunc,
413
+ const Eigen::Vector3<S>&,
414
+ Index,
415
+ Eigen::Vector3<S>&>) {
416
+ queryClosestHelper</*IsPacket=*/false, /*NeedBarycentric=*/false>(
417
+ 0, query, std::forward<ClosestSurfacePointFunc>(func), std::numeric_limits<S>::max(), res);
418
+ } else if (std::is_invocable_r_v<
419
+ void,
420
+ ClosestSurfacePointFunc,
421
+ const Eigen::Vector3<S>&,
422
+ Index,
423
+ Eigen::Vector3<S>&,
424
+ Eigen::Vector3<S>&>) {
425
+ queryClosestHelper</*IsPacket=*/false, /*NeedBarycentric=*/true>(
426
+ 0, query, std::forward<ClosestSurfacePointFunc>(func), std::numeric_limits<S>::max(), res);
427
+ } else {
428
+ XR_CHECK(
429
+ false,
430
+ "Callback function must be invocable with query type, primitive ID and return the closest projection point.");
431
+ }
432
+ return res;
433
+ }
434
+
435
+ template <typename S, size_t LeafCapacity>
436
+ template <typename ClosestSurfacePointFunc>
437
+ [[nodiscard]] ClosestSurfacePointResult<S> Bvh<S, LeafCapacity>::queryClosestSurfacePointPacket(
438
+ const Eigen::Vector3<S>& query,
439
+ ClosestSurfacePointFunc&& func) const {
440
+ // TODO(nemanjab, T176575677): Implement this without recursion. It should be faster.
441
+ ClosestSurfacePointResult<S> res{};
442
+ if constexpr (std::is_invocable_r_v<
443
+ void,
444
+ ClosestSurfacePointFunc,
445
+ const Eigen::Vector3<S>&,
446
+ const uint32_t,
447
+ const WideScalar<int32_t, LeafCapacity>&,
448
+ WideVec3<S, LeafCapacity>&,
449
+ WideScalar<S, LeafCapacity>&>) {
450
+ queryClosestHelper</*IsPacket=*/true, /*NeedBarycentric=*/false>(
451
+ 0, query, std::forward<ClosestSurfacePointFunc>(func), std::numeric_limits<S>::max(), res);
452
+ } else if (std::is_invocable_r_v<
453
+ void,
454
+ ClosestSurfacePointFunc,
455
+ const Eigen::Vector3<S>&,
456
+ const uint32_t,
457
+ const WideScalar<int32_t, LeafCapacity>&,
458
+ WideVec3<S, LeafCapacity>&,
459
+ WideVec3<S, LeafCapacity>&,
460
+ WideScalar<S, LeafCapacity>&>) {
461
+ queryClosestHelper</*IsPacket=*/true, /*NeedBarycentric=*/true>(
462
+ 0, query, std::forward<ClosestSurfacePointFunc>(func), std::numeric_limits<S>::max(), res);
463
+ } else {
464
+ XR_CHECK(
465
+ false,
466
+ "Callback function must be invocable with query, prim count, prim IDs and return projections and their distances through out param.");
467
+ }
468
+ return res;
469
+ }
470
+
471
+ template <typename S, size_t LeafCapacity>
472
+ template <bool IsPacket, bool NeedBarycentric, typename ClosestSurfacePointFunc>
473
+ S Bvh<S, LeafCapacity>::queryClosestHelper(
474
+ const uint32_t nodeIdx,
475
+ const Eigen::Vector3<S>& query,
476
+ const ClosestSurfacePointFunc& func,
477
+ S sqrDist, // NOLINT
478
+ ClosestSurfacePointResult<S>& result) const {
479
+ const auto& currNode = flatTree_[nodeIdx];
480
+
481
+ // If we hit the leaf, update the closest distance.
482
+ if (currNode.isLeaf()) {
483
+ // We can still send non-packet query even if LeafCapacity is bigger than 1, which is good for
484
+ // debugging.
485
+ if constexpr (IsPacket) {
486
+ // We send up to N (depending on leaf capacity) primitives at once.
487
+ // The callback can use packet-based vectorization for data parallelism.
488
+ std::array<uint32_t, LeafCapacity> primIndices; // NOLINT
489
+ for (uint32_t o = 0; o < currNode.nPrims; ++o) {
490
+ primIndices[o] = buildPrimitives_[currNode.start + o].id;
491
+ }
492
+ WideVec3<S, LeafCapacity> projections;
493
+ WideScalar<S, LeafCapacity> squaredDistances;
494
+ [[maybe_unused]] WideVec3<S, LeafCapacity> barycentrics;
495
+ if constexpr (NeedBarycentric) {
496
+ func(
497
+ query,
498
+ currNode.nPrims,
499
+ drjit::load<WideScalar<int32_t, LeafCapacity>>(primIndices.data()),
500
+ projections,
501
+ barycentrics,
502
+ squaredDistances);
503
+ } else {
504
+ func(
505
+ query,
506
+ currNode.nPrims,
507
+ drjit::load<WideScalar<int32_t, LeafCapacity>>(primIndices.data()),
508
+ projections,
509
+ squaredDistances);
510
+ }
511
+ for (int i = 0; i < currNode.nPrims; ++i) {
512
+ if (squaredDistances[i] < sqrDist) {
513
+ sqrDist = squaredDistances[i];
514
+ result.point = Eigen::Vector3<S>{projections[0][i], projections[1][i], projections[2][i]};
515
+ result.triangleIdx = primIndices[i];
516
+ if constexpr (NeedBarycentric) {
517
+ result.baryCoords =
518
+ Eigen::Vector3<S>{barycentrics[0][i], barycentrics[1][i], barycentrics[2][i]};
519
+ }
520
+ }
521
+ }
522
+ } else {
523
+ // The base scalar case.
524
+ for (uint32_t o = 0; o < currNode.nPrims; ++o) {
525
+ const BoundingBox<S>& obj = buildPrimitives_[currNode.start + o];
526
+ Eigen::Vector3<S> projection;
527
+ [[maybe_unused]] Eigen::Vector3<S> barycentric;
528
+ if constexpr (NeedBarycentric) {
529
+ func(query, obj.id, projection, barycentric);
530
+ } else {
531
+ func(query, obj.id, projection);
532
+ }
533
+ const S distSq = (projection - query).squaredNorm();
534
+ if (distSq < sqrDist) {
535
+ result.point = std::move(projection);
536
+ result.triangleIdx = obj.id;
537
+ if constexpr (NeedBarycentric) {
538
+ result.baryCoords = std::move(barycentric);
539
+ }
540
+ sqrDist = distSq;
541
+ }
542
+ }
543
+ }
544
+ } else {
545
+ const auto& checkSubtree = [this, &query, &sqrDist, &func, &result](const uint32_t nodeIdx) {
546
+ ClosestSurfacePointResult<S> tempRes;
547
+ const S distSq =
548
+ queryClosestHelper<IsPacket, NeedBarycentric>(nodeIdx, query, func, sqrDist, tempRes);
549
+ if (distSq < sqrDist) {
550
+ sqrDist = distSq;
551
+ result = tempRes;
552
+ }
553
+ };
554
+
555
+ const auto& leftBox = flatTree_[currNode.getLeftIndex(nodeIdx)].bbox.aabb;
556
+ const auto& rightBox = flatTree_[currNode.getRightIndex(nodeIdx)].bbox.aabb;
557
+
558
+ // If we are inside an intermediate box, we need to explore the whole subtree.
559
+ // This is because the primitive could be at any distance from the query.
560
+ const bool checkedLeftSubtree = leftBox.contains(query);
561
+ if (checkedLeftSubtree) {
562
+ checkSubtree(currNode.getLeftIndex(nodeIdx));
563
+ }
564
+ const bool checkedRightSubtree = rightBox.contains(query);
565
+ if (checkedRightSubtree) {
566
+ checkSubtree(currNode.getRightIndex(nodeIdx));
567
+ }
568
+
569
+ // For the case where the query isn't inside, we'll need distance to the AABBs.
570
+ const S leftExtDistSq = leftBox.squaredExteriorDistance(query);
571
+ const S rightExtDistSq = rightBox.squaredExteriorDistance(query);
572
+ if (leftExtDistSq < rightExtDistSq) {
573
+ if (!checkedLeftSubtree && leftExtDistSq < sqrDist) {
574
+ checkSubtree(currNode.getLeftIndex(nodeIdx));
575
+ }
576
+ if (!checkedRightSubtree && rightExtDistSq < sqrDist) {
577
+ checkSubtree(currNode.getRightIndex(nodeIdx));
578
+ }
579
+ } else {
580
+ if (!checkedRightSubtree && rightExtDistSq < sqrDist) {
581
+ checkSubtree(currNode.getRightIndex(nodeIdx));
582
+ }
583
+ if (!checkedLeftSubtree && leftExtDistSq < sqrDist) {
584
+ checkSubtree(currNode.getLeftIndex(nodeIdx));
585
+ }
586
+ }
587
+ }
588
+
589
+ return sqrDist;
590
+ }
591
+
592
+ template <typename S, size_t LeafCapacity>
593
+ template <typename ReturnType, typename RayPrimitiveIntersector>
594
+ ReturnType Bvh<S, LeafCapacity>::rayQueryClosestHit(
595
+ const Eigen::Vector3<S>& origin,
596
+ const Eigen::Vector3<S>& direction,
597
+ S /* minT */,
598
+ S maxT,
599
+ RayPrimitiveIntersector&& func) const {
600
+ static_assert(
601
+ std::is_invocable_r_v<void, RayPrimitiveIntersector, Index, ReturnType&, S&>,
602
+ "Callback function must be invocable with a primitive index, result type to update and maximum distance to update.");
603
+
604
+ std::array<uint32_t, kMaxStackDepth> todoStack{};
605
+ Index stackLevel = 0;
606
+ todoStack[stackLevel] = 0; // Start from the root, node 0.
607
+
608
+ ReturnType result{};
609
+
610
+ const Eigen::Vector3<S> dirInv = direction.cwiseInverse();
611
+ while (stackLevel >= 0) {
612
+ // Pop off the next node to work on.
613
+ const auto currNode = todoStack[stackLevel--];
614
+ const auto& node(flatTree_[currNode]);
615
+
616
+ // This is the leaf condition.
617
+ if (node.isLeaf()) {
618
+ node.eachPrimitive(
619
+ buildPrimitives_, [&](const BoundingBox<S>& prim) { func(prim.id, result, maxT); });
620
+ } else { // Not a leaf => internal node with 2 children boxes.
621
+ if (flatTree_[node.getLeftIndex(currNode)].bbox.intersectsBranchless(origin, dirInv)) {
622
+ todoStack[++stackLevel] = node.getLeftIndex(currNode);
623
+ }
624
+ if (flatTree_[node.getRightIndex(currNode)].bbox.intersectsBranchless(origin, dirInv)) {
625
+ todoStack[++stackLevel] = node.getRightIndex(currNode);
626
+ }
627
+ }
628
+ }
629
+ return result;
630
+ }
631
+
632
+ template <typename S, size_t LeafCapacity>
633
+ template <typename RayPrimitiveIntersector>
634
+ bool Bvh<S, LeafCapacity>::rayQueryAnyHit(
635
+ const Eigen::Vector3<S>& origin,
636
+ const Eigen::Vector3<S>& direction,
637
+ S /* minT */,
638
+ S /* maxT */,
639
+ RayPrimitiveIntersector&& func) const {
640
+ static_assert(
641
+ std::is_invocable_r_v<bool, RayPrimitiveIntersector, Index>,
642
+ "Callback function must be invocable with a primitive index and return if the hit was valid.");
643
+
644
+ std::array<uint32_t, kMaxStackDepth> todoStack{};
645
+ Index stackLevel = 0;
646
+ todoStack[stackLevel] = 0; // Start from the root, node 0.
647
+
648
+ const Eigen::Vector3<S> dirInv = direction.cwiseInverse();
649
+ while (stackLevel >= 0) {
650
+ // Pop off the next node to work on.
651
+ const auto currNode = todoStack[stackLevel--];
652
+ const auto& node(flatTree_[currNode]);
653
+
654
+ // Is leaf -> Intersect
655
+ if (node.isLeaf()) {
656
+ for (Index o = 0; o < node.nPrims; ++o) {
657
+ if (func(buildPrimitives_[node.start + o].id)) {
658
+ return true;
659
+ }
660
+ }
661
+ } else { // Not a leaf => internal node with 2 children boxes.
662
+ if (flatTree_[node.getLeftIndex(currNode)].bbox.intersectsBranchless(origin, dirInv)) {
663
+ todoStack[++stackLevel] = node.getLeftIndex(currNode);
664
+ }
665
+ if (flatTree_[node.getRightIndex(currNode)].bbox.intersectsBranchless(origin, dirInv)) {
666
+ todoStack[++stackLevel] = node.getRightIndex(currNode);
667
+ }
668
+ }
669
+ }
670
+ return false;
671
+ }
672
+
673
+ template <typename S, size_t LeafCapacity>
674
+ template <typename Callback>
675
+ void Bvh<S, LeafCapacity>::traverseOverlappingPairs(Callback&& func) const {
676
+ static_assert(
677
+ std::is_invocable_r_v<bool, Callback, Index, Index>,
678
+ "Callback function must be invocable with two Index arguments and return bool");
679
+
680
+ if (nodeCount_ == 0) {
681
+ return;
682
+ }
683
+ traverseSelfCollision<S>(flatTree_, 0, buildPrimitives_, std::forward<Callback>(func));
684
+ }
685
+
686
+ template <typename S, size_t LeafCapacity>
687
+ template <typename Callback>
688
+ void Bvh<S, LeafCapacity>::traverseOverlappingPairs(
689
+ const Bvh<S, LeafCapacity>& other,
690
+ Callback&& func) const {
691
+ static_assert(
692
+ std::is_invocable_r_v<bool, Callback, Index, Index>,
693
+ "Callback function must be invocable with two Index arguments and return bool");
694
+
695
+ if (nodeCount_ == 0 || other.nodeCount_ == 0) {
696
+ return;
697
+ }
698
+ traverseCollision(
699
+ flatTree_,
700
+ 0,
701
+ buildPrimitives_,
702
+ other.flatTree_,
703
+ 0,
704
+ other.buildPrimitives_,
705
+ std::forward<Callback>(func));
706
+ }
707
+
708
+ } // namespace axel