pymomentum-cpu 0.1.84.post0__cp313-cp313-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.

Potentially problematic release.


This version of pymomentum-cpu might be problematic. Click here for more details.

Files changed (512) 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 +86 -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 +199 -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 +91 -0
  30. include/momentum/character/blend_shape_base.h +70 -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 +82 -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 +250 -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 +144 -0
  61. include/momentum/character_sequence_solver/sequence_solver_function.h +134 -0
  62. include/momentum/character_sequence_solver/state_sequence_error_function.h +109 -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 +924 -0
  73. include/momentum/character_solver/gauss_newton_solver_qr.h +64 -0
  74. include/momentum/character_solver/limit_error_function.h +57 -0
  75. include/momentum/character_solver/model_parameters_error_function.h +64 -0
  76. include/momentum/character_solver/normal_error_function.h +73 -0
  77. include/momentum/character_solver/orientation_error_function.h +74 -0
  78. include/momentum/character_solver/plane_error_function.h +102 -0
  79. include/momentum/character_solver/point_triangle_vertex_error_function.h +141 -0
  80. include/momentum/character_solver/pose_prior_error_function.h +80 -0
  81. include/momentum/character_solver/position_error_function.h +75 -0
  82. include/momentum/character_solver/projection_error_function.h +93 -0
  83. include/momentum/character_solver/simd_collision_error_function.h +99 -0
  84. include/momentum/character_solver/simd_normal_error_function.h +157 -0
  85. include/momentum/character_solver/simd_plane_error_function.h +164 -0
  86. include/momentum/character_solver/simd_position_error_function.h +165 -0
  87. include/momentum/character_solver/skeleton_error_function.h +151 -0
  88. include/momentum/character_solver/skeleton_solver_function.h +94 -0
  89. include/momentum/character_solver/skinned_locator_error_function.h +166 -0
  90. include/momentum/character_solver/skinned_locator_triangle_error_function.h +146 -0
  91. include/momentum/character_solver/skinning_weight_iterator.h +80 -0
  92. include/momentum/character_solver/state_error_function.h +94 -0
  93. include/momentum/character_solver/transform_pose.h +80 -0
  94. include/momentum/character_solver/trust_region_qr.h +80 -0
  95. include/momentum/character_solver/vertex_error_function.h +155 -0
  96. include/momentum/character_solver/vertex_projection_error_function.h +117 -0
  97. include/momentum/character_solver/vertex_vertex_distance_error_function.h +147 -0
  98. include/momentum/common/aligned.h +155 -0
  99. include/momentum/common/checks.h +27 -0
  100. include/momentum/common/exception.h +70 -0
  101. include/momentum/common/filesystem.h +20 -0
  102. include/momentum/common/fwd.h +27 -0
  103. include/momentum/common/log.h +173 -0
  104. include/momentum/common/log_channel.h +17 -0
  105. include/momentum/common/memory.h +71 -0
  106. include/momentum/common/profile.h +79 -0
  107. include/momentum/common/progress_bar.h +37 -0
  108. include/momentum/common/string.h +52 -0
  109. include/momentum/diff_ik/ceres_utility.h +73 -0
  110. include/momentum/diff_ik/fully_differentiable_body_ik.h +58 -0
  111. include/momentum/diff_ik/fully_differentiable_distance_error_function.h +69 -0
  112. include/momentum/diff_ik/fully_differentiable_motion_error_function.h +46 -0
  113. include/momentum/diff_ik/fully_differentiable_orientation_error_function.h +114 -0
  114. include/momentum/diff_ik/fully_differentiable_pose_prior_error_function.h +76 -0
  115. include/momentum/diff_ik/fully_differentiable_position_error_function.h +138 -0
  116. include/momentum/diff_ik/fully_differentiable_projection_error_function.h +65 -0
  117. include/momentum/diff_ik/fully_differentiable_skeleton_error_function.h +160 -0
  118. include/momentum/diff_ik/fully_differentiable_state_error_function.h +54 -0
  119. include/momentum/diff_ik/fwd.h +385 -0
  120. include/momentum/diff_ik/union_error_function.h +67 -0
  121. include/momentum/gui/rerun/eigen_adapters.h +70 -0
  122. include/momentum/gui/rerun/logger.h +102 -0
  123. include/momentum/gui/rerun/logging_redirect.h +27 -0
  124. include/momentum/io/character_io.h +56 -0
  125. include/momentum/io/common/gsl_utils.h +50 -0
  126. include/momentum/io/common/stream_utils.h +65 -0
  127. include/momentum/io/fbx/fbx_io.h +161 -0
  128. include/momentum/io/fbx/fbx_memory_stream.h +66 -0
  129. include/momentum/io/fbx/openfbx_loader.h +62 -0
  130. include/momentum/io/fbx/polygon_data.h +60 -0
  131. include/momentum/io/gltf/gltf_builder.h +132 -0
  132. include/momentum/io/gltf/gltf_file_format.h +19 -0
  133. include/momentum/io/gltf/gltf_io.h +148 -0
  134. include/momentum/io/gltf/utils/accessor_utils.h +299 -0
  135. include/momentum/io/gltf/utils/coordinate_utils.h +60 -0
  136. include/momentum/io/gltf/utils/json_utils.h +102 -0
  137. include/momentum/io/legacy_json/legacy_json_io.h +70 -0
  138. include/momentum/io/marker/c3d_io.h +30 -0
  139. include/momentum/io/marker/conversions.h +57 -0
  140. include/momentum/io/marker/coordinate_system.h +30 -0
  141. include/momentum/io/marker/marker_io.h +56 -0
  142. include/momentum/io/marker/trc_io.h +27 -0
  143. include/momentum/io/motion/mmo_io.h +97 -0
  144. include/momentum/io/shape/blend_shape_io.h +70 -0
  145. include/momentum/io/shape/pose_shape_io.h +21 -0
  146. include/momentum/io/skeleton/locator_io.h +41 -0
  147. include/momentum/io/skeleton/mppca_io.h +26 -0
  148. include/momentum/io/skeleton/parameter_limits_io.h +25 -0
  149. include/momentum/io/skeleton/parameter_transform_io.h +41 -0
  150. include/momentum/io/skeleton/parameters_io.h +20 -0
  151. include/momentum/io/urdf/urdf_io.h +26 -0
  152. include/momentum/io/usd/usd_io.h +36 -0
  153. include/momentum/marker_tracking/app_utils.h +62 -0
  154. include/momentum/marker_tracking/marker_tracker.h +213 -0
  155. include/momentum/marker_tracking/process_markers.h +58 -0
  156. include/momentum/marker_tracking/tracker_utils.h +90 -0
  157. include/momentum/math/constants.h +82 -0
  158. include/momentum/math/covariance_matrix.h +84 -0
  159. include/momentum/math/fmt_eigen.h +23 -0
  160. include/momentum/math/fwd.h +132 -0
  161. include/momentum/math/generalized_loss.h +61 -0
  162. include/momentum/math/intersection.h +32 -0
  163. include/momentum/math/mesh.h +84 -0
  164. include/momentum/math/mppca.h +67 -0
  165. include/momentum/math/online_householder_qr.h +516 -0
  166. include/momentum/math/random-inl.h +404 -0
  167. include/momentum/math/random.h +310 -0
  168. include/momentum/math/simd_generalized_loss.h +40 -0
  169. include/momentum/math/transform.h +229 -0
  170. include/momentum/math/types.h +461 -0
  171. include/momentum/math/utility.h +282 -0
  172. include/momentum/rasterizer/camera.h +453 -0
  173. include/momentum/rasterizer/fwd.h +102 -0
  174. include/momentum/rasterizer/geometry.h +83 -0
  175. include/momentum/rasterizer/image.h +18 -0
  176. include/momentum/rasterizer/rasterizer.h +583 -0
  177. include/momentum/rasterizer/tensor.h +140 -0
  178. include/momentum/rasterizer/utility.h +268 -0
  179. include/momentum/simd/simd.h +221 -0
  180. include/momentum/solver/fwd.h +131 -0
  181. include/momentum/solver/gauss_newton_solver.h +136 -0
  182. include/momentum/solver/gradient_descent_solver.h +65 -0
  183. include/momentum/solver/solver.h +155 -0
  184. include/momentum/solver/solver_function.h +126 -0
  185. include/momentum/solver/subset_gauss_newton_solver.h +109 -0
  186. include/rerun/archetypes/annotation_context.hpp +157 -0
  187. include/rerun/archetypes/arrows2d.hpp +271 -0
  188. include/rerun/archetypes/arrows3d.hpp +257 -0
  189. include/rerun/archetypes/asset3d.hpp +262 -0
  190. include/rerun/archetypes/asset_video.hpp +275 -0
  191. include/rerun/archetypes/bar_chart.hpp +261 -0
  192. include/rerun/archetypes/boxes2d.hpp +293 -0
  193. include/rerun/archetypes/boxes3d.hpp +369 -0
  194. include/rerun/archetypes/capsules3d.hpp +333 -0
  195. include/rerun/archetypes/clear.hpp +180 -0
  196. include/rerun/archetypes/depth_image.hpp +425 -0
  197. include/rerun/archetypes/ellipsoids3d.hpp +384 -0
  198. include/rerun/archetypes/encoded_image.hpp +250 -0
  199. include/rerun/archetypes/geo_line_strings.hpp +166 -0
  200. include/rerun/archetypes/geo_points.hpp +177 -0
  201. include/rerun/archetypes/graph_edges.hpp +152 -0
  202. include/rerun/archetypes/graph_nodes.hpp +206 -0
  203. include/rerun/archetypes/image.hpp +434 -0
  204. include/rerun/archetypes/instance_poses3d.hpp +221 -0
  205. include/rerun/archetypes/line_strips2d.hpp +289 -0
  206. include/rerun/archetypes/line_strips3d.hpp +270 -0
  207. include/rerun/archetypes/mesh3d.hpp +387 -0
  208. include/rerun/archetypes/pinhole.hpp +385 -0
  209. include/rerun/archetypes/points2d.hpp +333 -0
  210. include/rerun/archetypes/points3d.hpp +369 -0
  211. include/rerun/archetypes/recording_properties.hpp +132 -0
  212. include/rerun/archetypes/scalar.hpp +170 -0
  213. include/rerun/archetypes/scalars.hpp +153 -0
  214. include/rerun/archetypes/segmentation_image.hpp +305 -0
  215. include/rerun/archetypes/series_line.hpp +274 -0
  216. include/rerun/archetypes/series_lines.hpp +271 -0
  217. include/rerun/archetypes/series_point.hpp +265 -0
  218. include/rerun/archetypes/series_points.hpp +251 -0
  219. include/rerun/archetypes/tensor.hpp +213 -0
  220. include/rerun/archetypes/text_document.hpp +200 -0
  221. include/rerun/archetypes/text_log.hpp +211 -0
  222. include/rerun/archetypes/transform3d.hpp +925 -0
  223. include/rerun/archetypes/video_frame_reference.hpp +295 -0
  224. include/rerun/archetypes/view_coordinates.hpp +393 -0
  225. include/rerun/archetypes.hpp +43 -0
  226. include/rerun/arrow_utils.hpp +32 -0
  227. include/rerun/as_components.hpp +90 -0
  228. include/rerun/blueprint/archetypes/background.hpp +113 -0
  229. include/rerun/blueprint/archetypes/container_blueprint.hpp +259 -0
  230. include/rerun/blueprint/archetypes/dataframe_query.hpp +178 -0
  231. include/rerun/blueprint/archetypes/entity_behavior.hpp +130 -0
  232. include/rerun/blueprint/archetypes/force_center.hpp +115 -0
  233. include/rerun/blueprint/archetypes/force_collision_radius.hpp +141 -0
  234. include/rerun/blueprint/archetypes/force_link.hpp +136 -0
  235. include/rerun/blueprint/archetypes/force_many_body.hpp +124 -0
  236. include/rerun/blueprint/archetypes/force_position.hpp +132 -0
  237. include/rerun/blueprint/archetypes/line_grid3d.hpp +178 -0
  238. include/rerun/blueprint/archetypes/map_background.hpp +104 -0
  239. include/rerun/blueprint/archetypes/map_zoom.hpp +103 -0
  240. include/rerun/blueprint/archetypes/near_clip_plane.hpp +109 -0
  241. include/rerun/blueprint/archetypes/panel_blueprint.hpp +95 -0
  242. include/rerun/blueprint/archetypes/plot_legend.hpp +118 -0
  243. include/rerun/blueprint/archetypes/scalar_axis.hpp +116 -0
  244. include/rerun/blueprint/archetypes/tensor_scalar_mapping.hpp +146 -0
  245. include/rerun/blueprint/archetypes/tensor_slice_selection.hpp +167 -0
  246. include/rerun/blueprint/archetypes/tensor_view_fit.hpp +95 -0
  247. include/rerun/blueprint/archetypes/view_blueprint.hpp +170 -0
  248. include/rerun/blueprint/archetypes/view_contents.hpp +142 -0
  249. include/rerun/blueprint/archetypes/viewport_blueprint.hpp +200 -0
  250. include/rerun/blueprint/archetypes/visible_time_ranges.hpp +116 -0
  251. include/rerun/blueprint/archetypes/visual_bounds2d.hpp +109 -0
  252. include/rerun/blueprint/archetypes/visualizer_overrides.hpp +113 -0
  253. include/rerun/blueprint/archetypes.hpp +29 -0
  254. include/rerun/blueprint/components/active_tab.hpp +82 -0
  255. include/rerun/blueprint/components/apply_latest_at.hpp +79 -0
  256. include/rerun/blueprint/components/auto_layout.hpp +77 -0
  257. include/rerun/blueprint/components/auto_views.hpp +77 -0
  258. include/rerun/blueprint/components/background_kind.hpp +66 -0
  259. include/rerun/blueprint/components/column_share.hpp +78 -0
  260. include/rerun/blueprint/components/component_column_selector.hpp +81 -0
  261. include/rerun/blueprint/components/container_kind.hpp +65 -0
  262. include/rerun/blueprint/components/corner2d.hpp +64 -0
  263. include/rerun/blueprint/components/enabled.hpp +77 -0
  264. include/rerun/blueprint/components/filter_by_range.hpp +74 -0
  265. include/rerun/blueprint/components/filter_is_not_null.hpp +77 -0
  266. include/rerun/blueprint/components/force_distance.hpp +82 -0
  267. include/rerun/blueprint/components/force_iterations.hpp +82 -0
  268. include/rerun/blueprint/components/force_strength.hpp +82 -0
  269. include/rerun/blueprint/components/grid_columns.hpp +78 -0
  270. include/rerun/blueprint/components/grid_spacing.hpp +78 -0
  271. include/rerun/blueprint/components/included_content.hpp +86 -0
  272. include/rerun/blueprint/components/lock_range_during_zoom.hpp +82 -0
  273. include/rerun/blueprint/components/map_provider.hpp +64 -0
  274. include/rerun/blueprint/components/near_clip_plane.hpp +82 -0
  275. include/rerun/blueprint/components/panel_state.hpp +61 -0
  276. include/rerun/blueprint/components/query_expression.hpp +89 -0
  277. include/rerun/blueprint/components/root_container.hpp +77 -0
  278. include/rerun/blueprint/components/row_share.hpp +78 -0
  279. include/rerun/blueprint/components/selected_columns.hpp +76 -0
  280. include/rerun/blueprint/components/tensor_dimension_index_slider.hpp +90 -0
  281. include/rerun/blueprint/components/timeline_name.hpp +76 -0
  282. include/rerun/blueprint/components/view_class.hpp +76 -0
  283. include/rerun/blueprint/components/view_fit.hpp +61 -0
  284. include/rerun/blueprint/components/view_maximized.hpp +79 -0
  285. include/rerun/blueprint/components/view_origin.hpp +81 -0
  286. include/rerun/blueprint/components/viewer_recommendation_hash.hpp +82 -0
  287. include/rerun/blueprint/components/visible_time_range.hpp +77 -0
  288. include/rerun/blueprint/components/visual_bounds2d.hpp +74 -0
  289. include/rerun/blueprint/components/visualizer_override.hpp +86 -0
  290. include/rerun/blueprint/components/zoom_level.hpp +78 -0
  291. include/rerun/blueprint/components.hpp +41 -0
  292. include/rerun/blueprint/datatypes/component_column_selector.hpp +61 -0
  293. include/rerun/blueprint/datatypes/filter_by_range.hpp +59 -0
  294. include/rerun/blueprint/datatypes/filter_is_not_null.hpp +61 -0
  295. include/rerun/blueprint/datatypes/selected_columns.hpp +62 -0
  296. include/rerun/blueprint/datatypes/tensor_dimension_index_slider.hpp +63 -0
  297. include/rerun/blueprint/datatypes.hpp +9 -0
  298. include/rerun/c/arrow_c_data_interface.h +111 -0
  299. include/rerun/c/compiler_utils.h +10 -0
  300. include/rerun/c/rerun.h +627 -0
  301. include/rerun/c/sdk_info.h +28 -0
  302. include/rerun/collection.hpp +496 -0
  303. include/rerun/collection_adapter.hpp +43 -0
  304. include/rerun/collection_adapter_builtins.hpp +138 -0
  305. include/rerun/compiler_utils.hpp +61 -0
  306. include/rerun/component_batch.hpp +163 -0
  307. include/rerun/component_column.hpp +111 -0
  308. include/rerun/component_descriptor.hpp +142 -0
  309. include/rerun/component_type.hpp +35 -0
  310. include/rerun/components/aggregation_policy.hpp +76 -0
  311. include/rerun/components/albedo_factor.hpp +74 -0
  312. include/rerun/components/annotation_context.hpp +102 -0
  313. include/rerun/components/axis_length.hpp +74 -0
  314. include/rerun/components/blob.hpp +73 -0
  315. include/rerun/components/class_id.hpp +71 -0
  316. include/rerun/components/clear_is_recursive.hpp +75 -0
  317. include/rerun/components/color.hpp +99 -0
  318. include/rerun/components/colormap.hpp +99 -0
  319. include/rerun/components/depth_meter.hpp +84 -0
  320. include/rerun/components/draw_order.hpp +79 -0
  321. include/rerun/components/entity_path.hpp +83 -0
  322. include/rerun/components/fill_mode.hpp +72 -0
  323. include/rerun/components/fill_ratio.hpp +79 -0
  324. include/rerun/components/gamma_correction.hpp +80 -0
  325. include/rerun/components/geo_line_string.hpp +63 -0
  326. include/rerun/components/graph_edge.hpp +75 -0
  327. include/rerun/components/graph_node.hpp +79 -0
  328. include/rerun/components/graph_type.hpp +57 -0
  329. include/rerun/components/half_size2d.hpp +91 -0
  330. include/rerun/components/half_size3d.hpp +95 -0
  331. include/rerun/components/image_buffer.hpp +86 -0
  332. include/rerun/components/image_format.hpp +84 -0
  333. include/rerun/components/image_plane_distance.hpp +77 -0
  334. include/rerun/components/interactive.hpp +76 -0
  335. include/rerun/components/keypoint_id.hpp +74 -0
  336. include/rerun/components/lat_lon.hpp +89 -0
  337. include/rerun/components/length.hpp +77 -0
  338. include/rerun/components/line_strip2d.hpp +73 -0
  339. include/rerun/components/line_strip3d.hpp +73 -0
  340. include/rerun/components/magnification_filter.hpp +63 -0
  341. include/rerun/components/marker_shape.hpp +82 -0
  342. include/rerun/components/marker_size.hpp +74 -0
  343. include/rerun/components/media_type.hpp +157 -0
  344. include/rerun/components/name.hpp +83 -0
  345. include/rerun/components/opacity.hpp +77 -0
  346. include/rerun/components/pinhole_projection.hpp +94 -0
  347. include/rerun/components/plane3d.hpp +75 -0
  348. include/rerun/components/pose_rotation_axis_angle.hpp +73 -0
  349. include/rerun/components/pose_rotation_quat.hpp +71 -0
  350. include/rerun/components/pose_scale3d.hpp +102 -0
  351. include/rerun/components/pose_transform_mat3x3.hpp +87 -0
  352. include/rerun/components/pose_translation3d.hpp +96 -0
  353. include/rerun/components/position2d.hpp +86 -0
  354. include/rerun/components/position3d.hpp +90 -0
  355. include/rerun/components/radius.hpp +98 -0
  356. include/rerun/components/range1d.hpp +75 -0
  357. include/rerun/components/resolution.hpp +88 -0
  358. include/rerun/components/rotation_axis_angle.hpp +72 -0
  359. include/rerun/components/rotation_quat.hpp +71 -0
  360. include/rerun/components/scalar.hpp +76 -0
  361. include/rerun/components/scale3d.hpp +102 -0
  362. include/rerun/components/series_visible.hpp +76 -0
  363. include/rerun/components/show_labels.hpp +79 -0
  364. include/rerun/components/stroke_width.hpp +74 -0
  365. include/rerun/components/tensor_data.hpp +94 -0
  366. include/rerun/components/tensor_dimension_index_selection.hpp +77 -0
  367. include/rerun/components/tensor_height_dimension.hpp +71 -0
  368. include/rerun/components/tensor_width_dimension.hpp +71 -0
  369. include/rerun/components/texcoord2d.hpp +101 -0
  370. include/rerun/components/text.hpp +83 -0
  371. include/rerun/components/text_log_level.hpp +110 -0
  372. include/rerun/components/timestamp.hpp +76 -0
  373. include/rerun/components/transform_mat3x3.hpp +92 -0
  374. include/rerun/components/transform_relation.hpp +66 -0
  375. include/rerun/components/translation3d.hpp +96 -0
  376. include/rerun/components/triangle_indices.hpp +85 -0
  377. include/rerun/components/value_range.hpp +78 -0
  378. include/rerun/components/vector2d.hpp +92 -0
  379. include/rerun/components/vector3d.hpp +96 -0
  380. include/rerun/components/video_timestamp.hpp +120 -0
  381. include/rerun/components/view_coordinates.hpp +346 -0
  382. include/rerun/components/visible.hpp +74 -0
  383. include/rerun/components.hpp +77 -0
  384. include/rerun/config.hpp +52 -0
  385. include/rerun/datatypes/angle.hpp +76 -0
  386. include/rerun/datatypes/annotation_info.hpp +76 -0
  387. include/rerun/datatypes/blob.hpp +67 -0
  388. include/rerun/datatypes/bool.hpp +57 -0
  389. include/rerun/datatypes/channel_datatype.hpp +87 -0
  390. include/rerun/datatypes/class_description.hpp +92 -0
  391. include/rerun/datatypes/class_description_map_elem.hpp +69 -0
  392. include/rerun/datatypes/class_id.hpp +62 -0
  393. include/rerun/datatypes/color_model.hpp +68 -0
  394. include/rerun/datatypes/dvec2d.hpp +76 -0
  395. include/rerun/datatypes/entity_path.hpp +60 -0
  396. include/rerun/datatypes/float32.hpp +62 -0
  397. include/rerun/datatypes/float64.hpp +62 -0
  398. include/rerun/datatypes/image_format.hpp +107 -0
  399. include/rerun/datatypes/keypoint_id.hpp +63 -0
  400. include/rerun/datatypes/keypoint_pair.hpp +65 -0
  401. include/rerun/datatypes/mat3x3.hpp +105 -0
  402. include/rerun/datatypes/mat4x4.hpp +119 -0
  403. include/rerun/datatypes/pixel_format.hpp +142 -0
  404. include/rerun/datatypes/plane3d.hpp +60 -0
  405. include/rerun/datatypes/quaternion.hpp +110 -0
  406. include/rerun/datatypes/range1d.hpp +59 -0
  407. include/rerun/datatypes/range2d.hpp +55 -0
  408. include/rerun/datatypes/rgba32.hpp +94 -0
  409. include/rerun/datatypes/rotation_axis_angle.hpp +67 -0
  410. include/rerun/datatypes/tensor_buffer.hpp +529 -0
  411. include/rerun/datatypes/tensor_data.hpp +100 -0
  412. include/rerun/datatypes/tensor_dimension_index_selection.hpp +58 -0
  413. include/rerun/datatypes/tensor_dimension_selection.hpp +56 -0
  414. include/rerun/datatypes/time_int.hpp +62 -0
  415. include/rerun/datatypes/time_range.hpp +55 -0
  416. include/rerun/datatypes/time_range_boundary.hpp +175 -0
  417. include/rerun/datatypes/uint16.hpp +62 -0
  418. include/rerun/datatypes/uint32.hpp +62 -0
  419. include/rerun/datatypes/uint64.hpp +62 -0
  420. include/rerun/datatypes/utf8.hpp +76 -0
  421. include/rerun/datatypes/utf8pair.hpp +62 -0
  422. include/rerun/datatypes/uuid.hpp +60 -0
  423. include/rerun/datatypes/uvec2d.hpp +76 -0
  424. include/rerun/datatypes/uvec3d.hpp +80 -0
  425. include/rerun/datatypes/uvec4d.hpp +59 -0
  426. include/rerun/datatypes/vec2d.hpp +76 -0
  427. include/rerun/datatypes/vec3d.hpp +80 -0
  428. include/rerun/datatypes/vec4d.hpp +84 -0
  429. include/rerun/datatypes/video_timestamp.hpp +67 -0
  430. include/rerun/datatypes/view_coordinates.hpp +87 -0
  431. include/rerun/datatypes/visible_time_range.hpp +57 -0
  432. include/rerun/datatypes.hpp +51 -0
  433. include/rerun/demo_utils.hpp +75 -0
  434. include/rerun/entity_path.hpp +20 -0
  435. include/rerun/error.hpp +180 -0
  436. include/rerun/half.hpp +10 -0
  437. include/rerun/image_utils.hpp +187 -0
  438. include/rerun/indicator_component.hpp +59 -0
  439. include/rerun/loggable.hpp +54 -0
  440. include/rerun/recording_stream.hpp +960 -0
  441. include/rerun/rerun_sdk_export.hpp +25 -0
  442. include/rerun/result.hpp +86 -0
  443. include/rerun/rotation3d.hpp +33 -0
  444. include/rerun/sdk_info.hpp +20 -0
  445. include/rerun/spawn.hpp +21 -0
  446. include/rerun/spawn_options.hpp +57 -0
  447. include/rerun/string_utils.hpp +16 -0
  448. include/rerun/third_party/cxxopts.hpp +2198 -0
  449. include/rerun/time_column.hpp +288 -0
  450. include/rerun/timeline.hpp +38 -0
  451. include/rerun/type_traits.hpp +40 -0
  452. include/rerun.hpp +86 -0
  453. lib/cmake/axel/axel-config.cmake +45 -0
  454. lib/cmake/axel/axelTargets-release.cmake +19 -0
  455. lib/cmake/axel/axelTargets.cmake +108 -0
  456. lib/cmake/momentum/Findre2.cmake +52 -0
  457. lib/cmake/momentum/momentum-config.cmake +67 -0
  458. lib/cmake/momentum/momentumTargets-release.cmake +259 -0
  459. lib/cmake/momentum/momentumTargets.cmake +377 -0
  460. lib/cmake/rerun_sdk/rerun_sdkConfig.cmake +70 -0
  461. lib/cmake/rerun_sdk/rerun_sdkConfigVersion.cmake +83 -0
  462. lib/cmake/rerun_sdk/rerun_sdkTargets-release.cmake +19 -0
  463. lib/cmake/rerun_sdk/rerun_sdkTargets.cmake +108 -0
  464. lib/libarrow.a +0 -0
  465. lib/libarrow_bundled_dependencies.a +0 -0
  466. lib/libaxel.a +0 -0
  467. lib/libmomentum_app_utils.a +0 -0
  468. lib/libmomentum_character.a +0 -0
  469. lib/libmomentum_character_sequence_solver.a +0 -0
  470. lib/libmomentum_character_solver.a +0 -0
  471. lib/libmomentum_common.a +0 -0
  472. lib/libmomentum_diff_ik.a +0 -0
  473. lib/libmomentum_io.a +0 -0
  474. lib/libmomentum_io_common.a +0 -0
  475. lib/libmomentum_io_fbx.a +0 -0
  476. lib/libmomentum_io_gltf.a +0 -0
  477. lib/libmomentum_io_legacy_json.a +0 -0
  478. lib/libmomentum_io_marker.a +0 -0
  479. lib/libmomentum_io_motion.a +0 -0
  480. lib/libmomentum_io_shape.a +0 -0
  481. lib/libmomentum_io_skeleton.a +0 -0
  482. lib/libmomentum_io_urdf.a +0 -0
  483. lib/libmomentum_marker_tracker.a +0 -0
  484. lib/libmomentum_math.a +0 -0
  485. lib/libmomentum_online_qr.a +0 -0
  486. lib/libmomentum_process_markers.a +0 -0
  487. lib/libmomentum_rerun.a +0 -0
  488. lib/libmomentum_simd_constraints.a +0 -0
  489. lib/libmomentum_simd_generalized_loss.a +0 -0
  490. lib/libmomentum_skeleton.a +0 -0
  491. lib/libmomentum_solver.a +0 -0
  492. lib/librerun_c__macos_arm64.a +0 -0
  493. lib/librerun_sdk.a +0 -0
  494. pymomentum/axel.cpython-313-darwin.so +0 -0
  495. pymomentum/backend/__init__.py +16 -0
  496. pymomentum/backend/skel_state_backend.py +631 -0
  497. pymomentum/backend/trs_backend.py +889 -0
  498. pymomentum/backend/utils.py +224 -0
  499. pymomentum/geometry.cpython-313-darwin.so +0 -0
  500. pymomentum/marker_tracking.cpython-313-darwin.so +0 -0
  501. pymomentum/quaternion.py +740 -0
  502. pymomentum/skel_state.py +514 -0
  503. pymomentum/solver.cpython-313-darwin.so +0 -0
  504. pymomentum/solver2.cpython-313-darwin.so +0 -0
  505. pymomentum/torch/character.py +863 -0
  506. pymomentum/torch/parameter_limits.py +494 -0
  507. pymomentum/torch/utility.py +20 -0
  508. pymomentum/trs.py +535 -0
  509. pymomentum_cpu-0.1.84.post0.dist-info/METADATA +126 -0
  510. pymomentum_cpu-0.1.84.post0.dist-info/RECORD +512 -0
  511. pymomentum_cpu-0.1.84.post0.dist-info/WHEEL +5 -0
  512. pymomentum_cpu-0.1.84.post0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,960 @@
1
+ #pragma once
2
+
3
+ #include <chrono>
4
+ #include <cstdint> // uint32_t etc.
5
+ #include <filesystem>
6
+ #include <optional>
7
+ #include <string_view>
8
+ #include <type_traits>
9
+ #include <vector>
10
+
11
+ #include "as_components.hpp"
12
+ #include "component_column.hpp"
13
+ #include "error.hpp"
14
+ #include "spawn_options.hpp"
15
+ #include "time_column.hpp"
16
+
17
+ namespace rerun {
18
+ struct ComponentBatch;
19
+
20
+ enum class StoreKind {
21
+ Recording,
22
+ Blueprint,
23
+ };
24
+
25
+ /// A `RecordingStream` handles everything related to logging data into Rerun.
26
+ ///
27
+ /// ## Multithreading and ordering
28
+ ///
29
+ /// A `RecordingStream` is thread-safe.
30
+ ///
31
+ /// Internally, all operations are linearized into a pipeline:
32
+ /// - All operations sent by a given thread will take effect in the same exact order as that
33
+ /// thread originally sent them in, from its point of view.
34
+ /// - There isn't any well defined global order across multiple threads.
35
+ ///
36
+ /// This means that e.g. flushing the pipeline (`flush_blocking`) guarantees that all
37
+ /// previous data sent by the calling thread has been recorded; no more, no less.
38
+ /// (e.g. it does not mean that all file caches are flushed)
39
+ ///
40
+ /// ## Shutdown
41
+ ///
42
+ /// The `RecordingStream` can only be shutdown by dropping all instances of it, at which point
43
+ /// it will automatically take care of flushing any pending data that might remain in the
44
+ /// pipeline.
45
+ ///
46
+ /// TODO(andreas): The only way of having two instances of a `RecordingStream` is currently to
47
+ /// set it as a the global.
48
+ ///
49
+ /// Shutting down cannot ever block.
50
+ ///
51
+ /// ## Logging
52
+ ///
53
+ /// Internally, the stream will automatically micro-batch multiple log calls to optimize
54
+ /// transport.
55
+ /// See [SDK Micro Batching](https://www.rerun.io/docs/reference/sdk/micro-batching) for
56
+ /// more information.
57
+ ///
58
+ /// The data will be timestamped automatically based on the `RecordingStream`'s
59
+ /// internal clock.
60
+ class RecordingStream {
61
+ private:
62
+ // TODO(grtlr): Ideally we'd expose more of the `EntityPath` struct to the C++ world so
63
+ // that we don't have to hardcode this here.
64
+ static constexpr const char PROPERTIES_ENTITY_PATH[] = "__properties/";
65
+ static constexpr const char RECORDING_PROPERTIES_ENTITY_PATH[] = "__properties/recording/";
66
+
67
+ public:
68
+ /// Creates a new recording stream to log to.
69
+ ///
70
+ /// \param app_id The user-chosen name of the application doing the logging.
71
+ /// \param recording_id The user-chosen name of the recording being logged to.
72
+ /// \param store_kind Whether to log to the recording store or the blueprint store.
73
+ RecordingStream(
74
+ std::string_view app_id, std::string_view recording_id = std::string_view(),
75
+ StoreKind store_kind = StoreKind::Recording
76
+ );
77
+ ~RecordingStream();
78
+
79
+ /// \private
80
+ RecordingStream(RecordingStream&& other);
81
+
82
+ // TODO(andreas): We could easily make the recording stream trivial to copy by bumping Rusts
83
+ // ref counter by adding a copy of the recording stream to the list of C recording streams.
84
+ // Doing it this way would likely yield the most consistent behavior when interacting with
85
+ // global streams (and especially when interacting with different languages in the same
86
+ // application).
87
+ /// \private
88
+ RecordingStream(const RecordingStream&) = delete;
89
+ /// \private
90
+ RecordingStream() = delete;
91
+
92
+ // -----------------------------------------------------------------------------------------
93
+ /// \name Properties
94
+ /// @{
95
+
96
+ /// Returns the store kind as passed during construction
97
+ StoreKind kind() const {
98
+ return _store_kind;
99
+ }
100
+
101
+ /// Returns whether the recording stream is enabled.
102
+ ///
103
+ /// All log functions early out if a recording stream is disabled.
104
+ /// Naturally, logging functions that take unserialized data will skip the serialization step as well.
105
+ bool is_enabled() const {
106
+ return _enabled;
107
+ }
108
+
109
+ /// @}
110
+
111
+ // -----------------------------------------------------------------------------------------
112
+ /// \name Controlling globally available instances of RecordingStream.
113
+ /// @{
114
+
115
+ /// Replaces the currently active recording for this stream's store kind in the global scope
116
+ /// with this one.
117
+ ///
118
+ /// Afterwards, destroying this recording stream will *not* change the global recording
119
+ /// stream, as it increases an internal ref-count.
120
+ void set_global() const;
121
+
122
+ /// Replaces the currently active recording for this stream's store kind in the thread-local
123
+ /// scope with this one
124
+ ///
125
+ /// Afterwards, destroying this recording stream will *not* change the thread local
126
+ /// recording stream, as it increases an internal ref-count.
127
+ void set_thread_local() const;
128
+
129
+ /// Retrieves the most appropriate globally available recording stream for the given kind.
130
+ ///
131
+ /// I.e. thread-local first, then global.
132
+ /// If neither was set, any operations on the returned stream will be no-ops.
133
+ static RecordingStream& current(StoreKind store_kind = StoreKind::Recording);
134
+
135
+ /// @}
136
+
137
+ // -----------------------------------------------------------------------------------------
138
+ /// \name Directing the recording stream.
139
+ /// \details Either of these needs to be called, otherwise the stream will buffer up indefinitely.
140
+ /// @{
141
+
142
+ /// Connect to a remote Rerun Viewer on the given URL.
143
+ ///
144
+ /// Requires that you first start a Rerun Viewer by typing 'rerun' in a terminal.
145
+ ///
146
+ /// url:
147
+ /// The scheme must be one of `rerun://`, `rerun+http://`, or `rerun+https://`,
148
+ /// and the pathname must be `/proxy`.
149
+ ///
150
+ /// The default is `rerun+http://127.0.0.1:9876/proxy`.
151
+ ///
152
+ /// flush_timeout_sec:
153
+ /// The minimum time the SDK will wait during a flush before potentially
154
+ /// dropping data if progress is not being made. Passing a negative value indicates no
155
+ /// timeout, and can cause a call to `flush` to block indefinitely.
156
+ ///
157
+ /// This function returns immediately.
158
+ Error connect_grpc(
159
+ std::string_view url = "rerun+http://127.0.0.1:9876/proxy",
160
+ float flush_timeout_sec = 2.0
161
+ ) const;
162
+
163
+ /// Swaps the underlying sink for a gRPC server sink pre-configured to listen on `rerun+http://{bind_ip}:{port}/proxy`.
164
+ ///
165
+ /// The gRPC server will buffer all log data in memory so that late connecting viewers will get all the data.
166
+ /// You can limit the amount of data buffered by the gRPC server with the `server_memory_limit` argument.
167
+ /// Once reached, the earliest logged data will be dropped. Static data is never dropped.
168
+ ///
169
+ /// Returns the URI of the gRPC server so you can connect to it from a viewer.
170
+ ///
171
+ /// This function returns immediately.
172
+ Result<std::string> serve_grpc(
173
+ std::string_view bind_ip = "0.0.0.0", uint16_t port = 9876,
174
+ std::string_view server_memory_limit = "75%"
175
+ ) const;
176
+
177
+ /// Spawns a new Rerun Viewer process from an executable available in PATH, then connects to it
178
+ /// over gRPC.
179
+ ///
180
+ /// flush_timeout_sec:
181
+ /// The minimum time the SDK will wait during a flush before potentially
182
+ /// dropping data if progress is not being made. Passing a negative value indicates no
183
+ /// timeout, and can cause a call to `flush` to block indefinitely.
184
+ ///
185
+ /// If a Rerun Viewer is already listening on this port, the stream will be redirected to
186
+ /// that viewer instead of starting a new one.
187
+ ///
188
+ /// ## Parameters
189
+ /// options:
190
+ /// See `rerun::SpawnOptions` for more information.
191
+ Error spawn(const SpawnOptions& options = {}, float flush_timeout_sec = 2.0) const;
192
+
193
+ /// @see RecordingStream::spawn
194
+ template <typename TRep, typename TPeriod>
195
+ Error spawn(
196
+ const SpawnOptions& options = {},
197
+ std::chrono::duration<TRep, TPeriod> flush_timeout = std::chrono::seconds(2)
198
+ ) const {
199
+ using seconds_float = std::chrono::duration<float>; // Default ratio is 1:1 == seconds.
200
+ return spawn(options, std::chrono::duration_cast<seconds_float>(flush_timeout).count());
201
+ }
202
+
203
+ /// Stream all log-data to a given `.rrd` file.
204
+ ///
205
+ /// The Rerun Viewer is able to read continuously from the resulting rrd file while it is being written.
206
+ /// However, depending on your OS and configuration, changes may not be immediately visible due to file caching.
207
+ /// This is a common issue on Windows and (to a lesser extent) on MacOS.
208
+ ///
209
+ /// This function returns immediately.
210
+ Error save(std::string_view path) const;
211
+
212
+ /// Stream all log-data to standard output.
213
+ ///
214
+ /// Pipe the result into the Rerun Viewer to visualize it.
215
+ ///
216
+ /// If there isn't any listener at the other end of the pipe, the `RecordingStream` will
217
+ /// default back to `buffered` mode, in order not to break the user's terminal.
218
+ ///
219
+ /// This function returns immediately.
220
+ //
221
+ // NOTE: This should be called `stdout` like in other SDK, but turns out that `stdout` is a
222
+ // macro when compiling with msvc [1].
223
+ // [1]: https://learn.microsoft.com/en-us/cpp/c-runtime-library/stdin-stdout-stderr?view=msvc-170
224
+ Error to_stdout() const;
225
+
226
+ /// Initiates a flush the batching pipeline and waits for it to propagate.
227
+ ///
228
+ /// See `RecordingStream` docs for ordering semantics and multithreading guarantees.
229
+ void flush_blocking() const;
230
+
231
+ /// @}
232
+
233
+ // -----------------------------------------------------------------------------------------
234
+ /// \name Controlling log time (index).
235
+ /// \details
236
+ /// @{
237
+
238
+ /// Set the index value of the given timeline as a sequence number, for the current calling thread.
239
+ ///
240
+ /// Used for all subsequent logging performed from this same thread, until the next call
241
+ /// to one of the time setting methods.
242
+ ///
243
+ /// For example: `rec.set_time_sequence("frame_nr", frame_nr)`.
244
+ ///
245
+ /// You can remove a timeline from subsequent log calls again using `rec.disable_timeline`.
246
+ /// @see set_time_sequence, set_time_duration, set_time_duration_secs, set_time_duration_nanos, set_time_timestamp, set_time_timestamp_secs_since_epoch, set_time_timestamp_nanos_since_epoch
247
+ void set_time_sequence(std::string_view timeline_name, int64_t sequence_nr) const;
248
+
249
+ /// Set the index value of the given timeline as a duration, for the current calling thread.
250
+ ///
251
+ /// Used for all subsequent logging performed from this same thread, until the next call
252
+ /// to one of the time setting methods.
253
+ ///
254
+ /// For example: `rec.set_time_duration("runtime", time_since_start)`.
255
+ ///
256
+ /// You can remove a timeline from subsequent log calls again using `rec.disable_timeline`.
257
+ /// @see set_time_sequence, set_time_duration, set_time_duration_secs, set_time_duration_nanos, set_time_timestamp, set_time_timestamp_secs_since_epoch, set_time_timestamp_nanos_since_epoch
258
+ template <typename TRep, typename TPeriod>
259
+ void set_time_duration(
260
+ std::string_view timeline_name, std::chrono::duration<TRep, TPeriod> duration
261
+ ) const {
262
+ auto nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(duration).count();
263
+ set_time_duration_nanos(timeline_name, nanos);
264
+ }
265
+
266
+ /// Set the index value of the given timeline as a duration in seconds, for the current calling thread.
267
+ ///
268
+ /// Used for all subsequent logging performed from this same thread, until the next call
269
+ /// to one of the time setting methods.
270
+ ///
271
+ /// For example: `rec.set_time_duration_secs("runtime", seconds_since_start)`.
272
+ ///
273
+ /// You can remove a timeline from subsequent log calls again using `rec.disable_timeline`.
274
+ /// @see set_time_sequence, set_time_duration, set_time_duration_secs, set_time_duration_nanos, set_time_timestamp, set_time_timestamp_secs_since_epoch, set_time_timestamp_nanos_since_epoch
275
+ void set_time_duration_secs(std::string_view timeline_name, double secs) const {
276
+ set_time_duration_nanos(timeline_name, static_cast<int64_t>(1e9 * secs + 0.5));
277
+ }
278
+
279
+ /// Set the index value of the given timeline as a duration in nanoseconds, for the current calling thread.
280
+ ///
281
+ /// Used for all subsequent logging performed from this same thread, until the next call
282
+ /// to one of the time setting methods.
283
+ ///
284
+ /// For example: `rec.set_time_duration_nanos("runtime", nanos_since_start)`.
285
+ ///
286
+ /// You can remove a timeline from subsequent log calls again using `rec.disable_timeline`.
287
+ /// @see set_time_sequence, set_time_duration, set_time_duration_secs, set_time_duration_nanos, set_time_timestamp, set_time_timestamp_secs_since_epoch, set_time_timestamp_nanos_since_epoch
288
+ void set_time_duration_nanos(std::string_view timeline_name, int64_t nanos) const;
289
+
290
+ /// Set the index value of the given timeline as a timestamp, for the current calling thread.
291
+ ///
292
+ /// Used for all subsequent logging performed from this same thread, until the next call
293
+ /// to one of the time setting methods.
294
+ ///
295
+ /// For example: `rec.set_time_timestamp("capture_time", now())`.
296
+ ///
297
+ /// You can remove a timeline from subsequent log calls again using `rec.disable_timeline`.
298
+ /// @see set_time_sequence, set_time_duration, set_time_duration_secs, set_time_duration_nanos, set_time_timestamp, set_time_timestamp_secs_since_epoch, set_time_timestamp_nanos_since_epoch
299
+ template <typename TClock>
300
+ void set_time_timestamp(
301
+ std::string_view timeline_name, std::chrono::time_point<TClock> timestamp
302
+ ) const {
303
+ set_time_timestamp_nanos_since_epoch(
304
+ timeline_name,
305
+ std::chrono::duration_cast<std::chrono::nanoseconds>(timestamp.time_since_epoch())
306
+ .count()
307
+ );
308
+ }
309
+
310
+ /// Set the index value of the given timeline as seconds since Unix Epoch (1970), for the current calling thread.
311
+ ///
312
+ /// Used for all subsequent logging performed from this same thread, until the next call
313
+ /// to one of the time setting methods.
314
+ ///
315
+ /// For example: `rec.set_time_timestamp_secs_since_epoch("capture_time", secs_since_epoch())`.
316
+ ///
317
+ /// You can remove a timeline from subsequent log calls again using `rec.disable_timeline`.
318
+ /// @see set_time_sequence, set_time_duration, set_time_duration_secs, set_time_duration_nanos, set_time_timestamp, set_time_timestamp_secs_since_epoch, set_time_timestamp_nanos_since_epoch
319
+ void set_time_timestamp_secs_since_epoch(std::string_view timeline_name, double seconds)
320
+ const {
321
+ set_time_timestamp_nanos_since_epoch(
322
+ timeline_name,
323
+ static_cast<int64_t>(1e9 * seconds)
324
+ );
325
+ }
326
+
327
+ /// Set the index value of the given timeline as nanoseconds since Unix Epoch (1970), for the current calling thread.
328
+ ///
329
+ /// Used for all subsequent logging performed from this same thread, until the next call
330
+ /// to one of the time setting methods.
331
+ ///
332
+ /// For example: `rec.set_time_timestamp_nanos_since_epoch("capture_time", nanos_since_epoch())`.
333
+ ///
334
+ /// You can remove a timeline from subsequent log calls again using `rec.disable_timeline`.
335
+ /// @see set_time_sequence, set_time_duration, set_time_duration_secs, set_time_duration_nanos, set_time_timestamp, set_time_timestamp_secs_since_epoch, set_time_timestamp_nanos_since_epoch
336
+ void set_time_timestamp_nanos_since_epoch(std::string_view timeline_name, int64_t nanos)
337
+ const;
338
+
339
+ /// Set the current time of the recording, for the current calling thread.
340
+ ///
341
+ /// Used for all subsequent logging performed from this same thread, until the next call
342
+ /// to one of the time setting methods.
343
+ ///
344
+ /// For example: `rec.set_time("sim_time", sim_time_secs)`.
345
+ ///
346
+ /// You can remove a timeline from subsequent log calls again using `rec.disable_timeline`.
347
+ /// @see set_time_sequence, set_time_seconds, set_time_nanos, reset_time, disable_timeline
348
+ template <typename TClock>
349
+ [[deprecated("Renamed to `set_time_timestamp`")]] void set_time(
350
+ std::string_view timeline_name, std::chrono::time_point<TClock> time
351
+ ) const {
352
+ set_time(timeline_name, time.time_since_epoch());
353
+ }
354
+
355
+ /// Set the current time of the recording, for the current calling thread.
356
+ ///
357
+ /// Used for all subsequent logging performed from this same thread, until the next call
358
+ /// to one of the time setting methods.
359
+ ///
360
+ /// For example: `rec.set_time("sim_time", sim_time_secs)`.
361
+ ///
362
+ /// You can remove a timeline from subsequent log calls again using `rec.disable_timeline`.
363
+ /// @see set_time_sequence, set_time_seconds, set_time_nanos, reset_time, disable_timeline
364
+ template <typename TRep, typename TPeriod>
365
+ [[deprecated("Renamed `set_time_duration`")]] void set_time(
366
+ std::string_view timeline_name, std::chrono::duration<TRep, TPeriod> time
367
+ ) const {
368
+ set_time_duration(timeline_name, time);
369
+ }
370
+
371
+ /// Set the current time of the recording, for the current calling thread.
372
+ ///
373
+ /// Used for all subsequent logging performed from this same thread, until the next call
374
+ /// to one of the time setting methods.
375
+ ///
376
+ /// For example: `rec.set_time_seconds("sim_time", sim_time_secs)`.
377
+ ///
378
+ /// You can remove a timeline from subsequent log calls again using `rec.disable_timeline`.
379
+ /// @see set_time_sequence, set_time_nanos, reset_time, set_time, disable_timeline
380
+ [[deprecated("Use either `set_time_duration_secs` or `set_time_timestamp_secs_since_epoch`"
381
+ )]] void
382
+ set_time_seconds(std::string_view timeline_name, double seconds) const {
383
+ set_time_duration_secs(timeline_name, seconds);
384
+ }
385
+
386
+ /// Set the current time of the recording, for the current calling thread.
387
+ ///
388
+ /// Used for all subsequent logging performed from this same thread, until the next call
389
+ /// to one of the time setting methods.
390
+ ///
391
+ /// For example: `rec.set_time_nanos("sim_time", sim_time_nanos)`.
392
+ ///
393
+ /// You can remove a timeline from subsequent log calls again using `rec.disable_timeline`.
394
+ /// @see set_time_sequence, set_time_seconds, reset_time, set_time, disable_timeline
395
+ [[deprecated(
396
+ "Use either `set_time_duration_nanos` or `set_time_timestamp_nanos_since_epoch`"
397
+ )]] void
398
+ set_time_nanos(std::string_view timeline_name, int64_t nanos) const {
399
+ set_time_duration_nanos(timeline_name, nanos);
400
+ }
401
+
402
+ /// Stops logging to the specified timeline for subsequent log calls.
403
+ ///
404
+ /// The timeline is still there, but will not be updated with any new data.
405
+ ///
406
+ /// No-op if the timeline doesn't exist.
407
+ ///
408
+ /// @see set_time_sequence, set_time_seconds, set_time, reset_time
409
+ void disable_timeline(std::string_view timeline_name) const;
410
+
411
+ /// Clears out the current time of the recording, for the current calling thread.
412
+ ///
413
+ /// Used for all subsequent logging performed from this same thread, until the next call
414
+ /// to one of the time setting methods.
415
+ ///
416
+ /// For example: `rec.reset_time()`.
417
+ /// @see set_time_sequence, set_time_seconds, set_time_nanos, disable_timeline
418
+ void reset_time() const;
419
+
420
+ /// @}
421
+
422
+ // -----------------------------------------------------------------------------------------
423
+ /// \name Sending & logging data.
424
+ /// @{
425
+
426
+ /// Logs one or more archetype and/or component batches.
427
+ ///
428
+ /// This is the main entry point for logging data to rerun. It can be used to log anything
429
+ /// that implements the `AsComponents<T>` trait.
430
+ ///
431
+ /// When logging data, you must always provide an [entity_path](https://www.rerun.io/docs/concepts/entity-path)
432
+ /// for identifying the data. Note that paths prefixed with "__" are considered reserved for use by the Rerun SDK
433
+ /// itself and should not be used for logging user data. This is where Rerun will log additional information
434
+ /// such as properties and warnings.
435
+ ///
436
+ /// The most common way to log is with one of the rerun archetypes, all of which implement the `AsComponents` trait.
437
+ ///
438
+ /// For example, to log two 3D points:
439
+ /// ```
440
+ /// rec.log("my/point", rerun::Points3D({{0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f}}));
441
+ /// ```
442
+ ///
443
+ /// The `log` function can flexibly accept an arbitrary number of additional objects which will
444
+ /// be merged into the first entity, for instance:
445
+ /// ```
446
+ /// // Log three points with arrows sticking out of them:
447
+ /// rec.log(
448
+ /// "my/points",
449
+ /// rerun::Points3D({{0.2f, 0.5f, 0.3f}, {0.9f, 1.2f, 0.1f}, {1.0f, 4.2f, 0.3f}})
450
+ /// .with_radii({0.1, 0.2, 0.3}),
451
+ /// rerun::Arrows3D::from_vectors({{0.3f, 2.1f, 0.2f}, {0.9f, -1.1, 2.3f}, {-0.4f, 0.5f, 2.9f}})
452
+ /// );
453
+ /// ```
454
+ ///
455
+ /// Any failures that may are handled with `Error::handle`.
456
+ ///
457
+ /// \param entity_path Path to the entity in the space hierarchy.
458
+ /// \param as_components Any type for which the `AsComponents<T>` trait is implemented.
459
+ /// This is the case for any archetype as well as individual or collection of `ComponentBatch`.
460
+ /// You can implement `AsComponents` for your own types as well
461
+ ///
462
+ /// @see try_log, log_static, try_log_with_static
463
+ template <typename... Ts>
464
+ void log(std::string_view entity_path, const Ts&... as_components) const {
465
+ if (!is_enabled()) {
466
+ return;
467
+ }
468
+ try_log_with_static(entity_path, false, as_components...).handle();
469
+ }
470
+
471
+ /// Logs one or more archetype and/or component batches as static data.
472
+ ///
473
+ /// Like `log` but logs the data as static:
474
+ /// Static data has no time associated with it, exists on all timelines, and unconditionally shadows
475
+ /// any temporal data of the same type.
476
+ ///
477
+ /// Failures are handled with `Error::handle`.
478
+ ///
479
+ /// \param entity_path Path to the entity in the space hierarchy.
480
+ /// \param as_components Any type for which the `AsComponents<T>` trait is implemented.
481
+ /// This is the case for any archetype as well as individual or collection of `ComponentBatch`.
482
+ /// You can implement `AsComponents` for your own types as well
483
+ ///
484
+ /// @see log, try_log_static, try_log_with_static
485
+ template <typename... Ts>
486
+ void log_static(std::string_view entity_path, const Ts&... as_components) const {
487
+ if (!is_enabled()) {
488
+ return;
489
+ }
490
+ try_log_with_static(entity_path, true, as_components...).handle();
491
+ }
492
+
493
+ /// Logs one or more archetype and/or component batches.
494
+ ///
495
+ /// See `log` for more information.
496
+ /// Unlike `log` this method returns an error if an error occurs.
497
+ ///
498
+ /// \param entity_path Path to the entity in the space hierarchy.
499
+ /// \param as_components Any type for which the `AsComponents<T>` trait is implemented.
500
+ /// This is the case for any archetype as well as individual or collection of `ComponentBatch`.
501
+ /// You can implement `AsComponents` for your own types as well
502
+ ///
503
+ /// @see log, try_log_static, try_log_with_static
504
+ template <typename... Ts>
505
+ Error try_log(std::string_view entity_path, const Ts&... as_components) const {
506
+ if (!is_enabled()) {
507
+ return Error::ok();
508
+ }
509
+ return try_log_with_static(entity_path, false, as_components...);
510
+ }
511
+
512
+ /// Logs one or more archetype and/or component batches as static data, returning an error.
513
+ ///
514
+ /// See `log`/`log_static` for more information.
515
+ /// Unlike `log_static` this method returns if an error occurs.
516
+ ///
517
+ /// \param entity_path Path to the entity in the space hierarchy.
518
+ /// \param as_components Any type for which the `AsComponents<T>` trait is implemented.
519
+ /// This is the case for any archetype as well as individual or collection of `ComponentBatch`.
520
+ /// You can implement `AsComponents` for your own types as well
521
+ /// \returns An error if an error occurs during evaluation of `AsComponents` or logging.
522
+ ///
523
+ /// @see log_static, try_log, try_log_with_static
524
+ template <typename... Ts>
525
+ Error try_log_static(std::string_view entity_path, const Ts&... as_components) const {
526
+ if (!is_enabled()) {
527
+ return Error::ok();
528
+ }
529
+ return try_log_with_static(entity_path, true, as_components...);
530
+ }
531
+
532
+ /// Logs one or more archetype and/or component batches optionally static, returning an error.
533
+ ///
534
+ /// See `log`/`log_static` for more information.
535
+ /// Returns an error if an error occurs during evaluation of `AsComponents` or logging.
536
+ ///
537
+ /// \param entity_path Path to the entity in the space hierarchy.
538
+ /// \param static_ If true, the logged components will be static.
539
+ /// Static data has no time associated with it, exists on all timelines, and unconditionally shadows
540
+ /// any temporal data of the same type.
541
+ /// Otherwise, the data will be timestamped automatically with `log_time` and `log_tick`.
542
+ /// Additional timelines set by `set_time_sequence` or `set_time` will also be included.
543
+ /// \param as_components Any type for which the `AsComponents<T>` trait is implemented.
544
+ /// This is the case for any archetype as well as individual or collection of `ComponentBatch`.
545
+ /// You can implement `AsComponents` for your own types as well
546
+ ///
547
+ /// @see log, try_log, log_static, try_log_static
548
+ template <typename... Ts>
549
+ void log_with_static(std::string_view entity_path, bool static_, const Ts&... as_components)
550
+ const {
551
+ try_log_with_static(entity_path, static_, as_components...).handle();
552
+ }
553
+
554
+ /// Logs one or more archetype and/or component batches optionally static, returning an error.
555
+ ///
556
+ /// See `log`/`log_static` for more information.
557
+ /// Returns an error if an error occurs during evaluation of `AsComponents` or logging.
558
+ ///
559
+ /// \param entity_path Path to the entity in the space hierarchy.
560
+ /// \param static_ If true, the logged components will be static.
561
+ /// Static data has no time associated with it, exists on all timelines, and unconditionally shadows
562
+ /// any temporal data of the same type.
563
+ /// Otherwise, the data will be timestamped automatically with `log_time` and `log_tick`.
564
+ /// Additional timelines set by `set_time_sequence` or `set_time` will also be included.
565
+ /// \param as_components Any type for which the `AsComponents<T>` trait is implemented.
566
+ /// This is the case for any archetype as well as individual or collection of `ComponentBatch`.
567
+ /// You can implement `AsComponents` for your own types as well
568
+ /// \returns An error if an error occurs during evaluation of `AsComponents` or logging.
569
+ ///
570
+ /// @see log, try_log, log_static, try_log_static
571
+ template <typename... Ts>
572
+ Error try_log_with_static(
573
+ std::string_view entity_path, bool static_, const Ts&... as_components
574
+ ) const {
575
+ if (!is_enabled()) {
576
+ return Error::ok();
577
+ }
578
+ std::vector<ComponentBatch> serialized_columns;
579
+ Error err;
580
+ (
581
+ [&] {
582
+ if (err.is_err()) {
583
+ return;
584
+ }
585
+
586
+ const Result<Collection<ComponentBatch>> serialization_result =
587
+ AsComponents<Ts>().as_batches(as_components);
588
+ if (serialization_result.is_err()) {
589
+ err = serialization_result.error;
590
+ return;
591
+ }
592
+
593
+ if (serialized_columns.empty()) {
594
+ // Fast path for the first batch (which is usually the only one!)
595
+ serialized_columns = std::move(serialization_result.value).to_vector();
596
+ } else {
597
+ serialized_columns.insert(
598
+ serialized_columns.end(),
599
+ std::make_move_iterator(serialization_result.value.begin()),
600
+ std::make_move_iterator(serialization_result.value.end())
601
+ );
602
+ }
603
+ }(),
604
+ ...
605
+ );
606
+ RR_RETURN_NOT_OK(err);
607
+
608
+ return try_log_serialized_batches(entity_path, static_, std::move(serialized_columns));
609
+ }
610
+
611
+ /// Logs several serialized batches batches, returning an error on failure.
612
+ ///
613
+ /// This is a more low-level API than `log`/`log_static\ and requires you to already serialize the data
614
+ /// ahead of time.
615
+ ///
616
+ /// \param entity_path Path to the entity in the space hierarchy.
617
+ /// \param static_ If true, the logged components will be static.
618
+ /// Static data has no time associated with it, exists on all timelines, and unconditionally shadows
619
+ /// any temporal data of the same type.
620
+ /// Otherwise, the data will be timestamped automatically with `log_time` and `log_tick`.
621
+ /// Additional timelines set by `set_time_sequence` or `set_time` will also be included.
622
+ /// \param batches The serialized batches to log.
623
+ ///
624
+ /// \see `log`, `try_log`, `log_static`, `try_log_static`, `try_log_with_static`
625
+ Error try_log_serialized_batches(
626
+ std::string_view entity_path, bool static_, std::vector<ComponentBatch> batches
627
+ ) const;
628
+
629
+ /// Bottom level API that logs raw data cells to the recording stream.
630
+ ///
631
+ /// In order to use this you need to pass serialized Arrow data cells.
632
+ ///
633
+ /// \param entity_path Path to the entity in the space hierarchy.
634
+ /// \param num_data_cells Number of data cells passed in.
635
+ /// \param data_cells The data cells to log.
636
+ /// \param inject_time
637
+ /// If set to `true`, the row's timestamp data will be overridden using the recording
638
+ /// streams internal clock.
639
+ ///
640
+ /// \see `try_log_serialized_batches`
641
+ Error try_log_data_row(
642
+ std::string_view entity_path, size_t num_data_cells, const ComponentBatch* data_cells,
643
+ bool inject_time
644
+ ) const;
645
+
646
+ /// Logs the file at the given `path` using all `DataLoader`s available.
647
+ ///
648
+ /// A single `path` might be handled by more than one loader.
649
+ ///
650
+ /// This method blocks until either at least one `DataLoader` starts streaming data in
651
+ /// or all of them fail.
652
+ ///
653
+ /// See <https://www.rerun.io/docs/reference/data-loaders/overview> for more information.
654
+ ///
655
+ /// \param filepath Path to the file to be logged.
656
+ /// \param entity_path_prefix What should the logged entity paths be prefixed with?
657
+ /// \param static_ If true, the logged components will be static.
658
+ /// Static data has no time associated with it, exists on all timelines, and unconditionally shadows
659
+ /// any temporal data of the same type.
660
+ /// Otherwise, the data will be timestamped automatically with `log_time` and `log_tick`.
661
+ /// Additional timelines set by `set_time_sequence` or `set_time` will also be included.
662
+ ///
663
+ /// \see `try_log_file_from_path`
664
+ void log_file_from_path(
665
+ const std::filesystem::path& filepath,
666
+ std::string_view entity_path_prefix = std::string_view(), bool static_ = false
667
+ ) const {
668
+ try_log_file_from_path(filepath, entity_path_prefix, static_).handle();
669
+ }
670
+
671
+ /// Logs the file at the given `path` using all `DataLoader`s available.
672
+ ///
673
+ /// A single `path` might be handled by more than one loader.
674
+ ///
675
+ /// This method blocks until either at least one `DataLoader` starts streaming data in
676
+ /// or all of them fail.
677
+ ///
678
+ /// See <https://www.rerun.io/docs/reference/data-loaders/overview> for more information.
679
+ ///
680
+ /// \param filepath Path to the file to be logged.
681
+ /// \param entity_path_prefix What should the logged entity paths be prefixed with?
682
+ /// \param static_ If true, the logged components will be static.
683
+ /// Static data has no time associated with it, exists on all timelines, and unconditionally shadows
684
+ /// any temporal data of the same type.
685
+ /// Otherwise, the data will be timestamped automatically with `log_time` and `log_tick`.
686
+ /// Additional timelines set by `set_time_sequence` or `set_time` will also be included.
687
+ ///
688
+ /// \see `log_file_from_path`
689
+ Error try_log_file_from_path(
690
+ const std::filesystem::path& filepath,
691
+ std::string_view entity_path_prefix = std::string_view(), bool static_ = false
692
+ ) const;
693
+
694
+ /// Logs the given `contents` using all `DataLoader`s available.
695
+ ///
696
+ /// A single `path` might be handled by more than one loader.
697
+ ///
698
+ /// This method blocks until either at least one `DataLoader` starts streaming data in
699
+ /// or all of them fail.
700
+ ///
701
+ /// See <https://www.rerun.io/docs/reference/data-loaders/overview> for more information.
702
+ ///
703
+ /// \param filepath Path to the file that the `contents` belong to.
704
+ /// \param contents Contents to be logged.
705
+ /// \param contents_size Size in bytes of the `contents`.
706
+ /// \param entity_path_prefix What should the logged entity paths be prefixed with?
707
+ /// \param static_ If true, the logged components will be static.
708
+ /// Static data has no time associated with it, exists on all timelines, and unconditionally shadows
709
+ /// any temporal data of the same type.
710
+ /// Otherwise, the data will be timestamped automatically with `log_time` and `log_tick`.
711
+ /// Additional timelines set by `set_time_sequence` or `set_time` will also be included.
712
+ ///
713
+ /// \see `try_log_file_from_contents`
714
+ void log_file_from_contents(
715
+ const std::filesystem::path& filepath, const std::byte* contents, size_t contents_size,
716
+ std::string_view entity_path_prefix = std::string_view(), bool static_ = false
717
+ ) const {
718
+ try_log_file_from_contents(
719
+ filepath,
720
+ contents,
721
+ contents_size,
722
+ entity_path_prefix,
723
+ static_
724
+ )
725
+ .handle();
726
+ }
727
+
728
+ /// Logs the given `contents` using all `DataLoader`s available.
729
+ ///
730
+ /// A single `path` might be handled by more than one loader.
731
+ ///
732
+ /// This method blocks until either at least one `DataLoader` starts streaming data in
733
+ /// or all of them fail.
734
+ ///
735
+ /// See <https://www.rerun.io/docs/reference/data-loaders/overview> for more information.
736
+ ///
737
+ /// \param filepath Path to the file that the `contents` belong to.
738
+ /// \param contents Contents to be logged.
739
+ /// \param contents_size Size in bytes of the `contents`.
740
+ /// \param entity_path_prefix What should the logged entity paths be prefixed with?
741
+ /// \param static_ If true, the logged components will be static.
742
+ /// Static data has no time associated with it, exists on all timelines, and unconditionally shadows
743
+ /// any temporal data of the same type.
744
+ /// Otherwise, the data will be timestamped automatically with `log_time` and `log_tick`.
745
+ /// Additional timelines set by `set_time_sequence` or `set_time` will also be included.
746
+ ///
747
+ /// \see `log_file_from_contents`
748
+ Error try_log_file_from_contents(
749
+ const std::filesystem::path& filepath, const std::byte* contents, size_t contents_size,
750
+ std::string_view entity_path_prefix = std::string_view(), bool static_ = false
751
+ ) const;
752
+
753
+ /// Directly log a columns of data to Rerun.
754
+ ///
755
+ /// This variant takes in arbitrary amount of `ComponentColumn`s and `ComponentColumn` collections.
756
+ ///
757
+ /// Unlike the regular `log` API, which is row-oriented, this API lets you submit the data
758
+ /// in a columnar form. Each `TimeColumn` and `ComponentColumn` represents a column of data that will be sent to Rerun.
759
+ /// The lengths of all of these columns must match, and all
760
+ /// data that shares the same index across the different columns will act as a single logical row,
761
+ /// equivalent to a single call to `RecordingStream::log`.
762
+ ///
763
+ /// Note that this API ignores any stateful time set on the log stream via the `RecordingStream::set_time_*` APIs.
764
+ /// Furthermore, this will _not_ inject the default timelines `log_tick` and `log_time` timeline columns.
765
+ ///
766
+ /// Any failures that may occur during serialization are handled with `Error::handle`.
767
+ ///
768
+ /// \param entity_path Path to the entity in the space hierarchy.
769
+ /// \param time_columns The time columns to send.
770
+ /// \param component_columns The columns of components to send. Both individual `ComponentColumn`s and `Collection<ComponentColumn>`s are accepted.
771
+ /// \see `try_send_columns`
772
+ template <typename... Ts>
773
+ void send_columns(
774
+ std::string_view entity_path, Collection<TimeColumn> time_columns,
775
+ Ts... component_columns // NOLINT
776
+ ) const {
777
+ try_send_columns(entity_path, time_columns, component_columns...).handle();
778
+ }
779
+
780
+ /// Directly log a columns of data to Rerun.
781
+ ///
782
+ /// This variant takes in arbitrary amount of `ComponentColumn`s and `ComponentColumn` collections.
783
+ ///
784
+ /// Unlike the regular `log` API, which is row-oriented, this API lets you submit the data
785
+ /// in a columnar form. Each `TimeColumn` and `ComponentColumn` represents a column of data that will be sent to Rerun.
786
+ /// The lengths of all of these columns must match, and all
787
+ /// data that shares the same index across the different columns will act as a single logical row,
788
+ /// equivalent to a single call to `RecordingStream::log`.
789
+ ///
790
+ /// Note that this API ignores any stateful time set on the log stream via the `RecordingStream::set_time_*` APIs.
791
+ /// Furthermore, this will _not_ inject the default timelines `log_tick` and `log_time` timeline columns.
792
+ ///
793
+ /// \param entity_path Path to the entity in the space hierarchy.
794
+ /// \param time_columns The time columns to send.
795
+ /// \param component_columns The columns of components to send. Both individual `ComponentColumn`s and `Collection<ComponentColumn>`s are accepted.
796
+ /// \see `send_columns`
797
+ template <typename... Ts>
798
+ Error try_send_columns(
799
+ std::string_view entity_path, Collection<TimeColumn> time_columns,
800
+ Ts... component_columns // NOLINT
801
+ ) const {
802
+ if constexpr (sizeof...(Ts) == 1) {
803
+ // Directly forward if this is only a single element,
804
+ // skipping collection of component column vector.
805
+ return try_send_columns(
806
+ entity_path,
807
+ std::move(time_columns),
808
+ Collection(std::forward<Ts...>(component_columns...))
809
+ );
810
+ }
811
+
812
+ std::vector<ComponentColumn> flat_column_list;
813
+ (
814
+ [&] {
815
+ static_assert(
816
+ std::is_same_v<std::remove_cv_t<Ts>, ComponentColumn> ||
817
+ std::is_constructible_v<Collection<ComponentColumn>, Ts>,
818
+ "Ts must be ComponentColumn or a collection thereof"
819
+ );
820
+
821
+ push_back_columns(flat_column_list, std::move(component_columns));
822
+ }(),
823
+ ...
824
+ );
825
+ return try_send_columns(
826
+ entity_path,
827
+ std::move(time_columns),
828
+ // Need to create collection explicitly, otherwise this becomes a recursive call.
829
+ Collection<ComponentColumn>(std::move(flat_column_list))
830
+ );
831
+ }
832
+
833
+ /// Directly log a columns of data to Rerun.
834
+ ///
835
+ /// Unlike the regular `log` API, which is row-oriented, this API lets you submit the data
836
+ /// in a columnar form. Each `TimeColumn` and `ComponentColumn` represents a column of data that will be sent to Rerun.
837
+ /// The lengths of all of these columns must match, and all
838
+ /// data that shares the same index across the different columns will act as a single logical row,
839
+ /// equivalent to a single call to `RecordingStream::log`.
840
+ ///
841
+ /// Note that this API ignores any stateful time set on the log stream via the `RecordingStream::set_time_*` APIs.
842
+ /// Furthermore, this will _not_ inject the default timelines `log_tick` and `log_time` timeline columns.
843
+ ///
844
+ /// Any failures that may occur during serialization are handled with `Error::handle`.
845
+ ///
846
+ /// \param entity_path Path to the entity in the space hierarchy.
847
+ /// \param time_columns The time columns to send.
848
+ /// \param component_columns The columns of components to send.
849
+ /// \see `try_send_columns`
850
+ void send_columns(
851
+ std::string_view entity_path, Collection<TimeColumn> time_columns,
852
+ Collection<ComponentColumn> component_columns
853
+ ) const {
854
+ try_send_columns(entity_path, time_columns, component_columns).handle();
855
+ }
856
+
857
+ /// Directly log a columns of data to Rerun.
858
+ ///
859
+ /// Unlike the regular `log` API, which is row-oriented, this API lets you submit the data
860
+ /// in a columnar form. Each `TimeColumn` and `ComponentColumn` represents a column of data that will be sent to Rerun.
861
+ /// The lengths of all of these columns must match, and all
862
+ /// data that shares the same index across the different columns will act as a single logical row,
863
+ /// equivalent to a single call to `RecordingStream::log`.
864
+ ///
865
+ /// Note that this API ignores any stateful time set on the log stream via the `RecordingStream::set_time_*` APIs.
866
+ /// Furthermore, this will _not_ inject the default timelines `log_tick` and `log_time` timeline columns.
867
+ ///
868
+ /// \param entity_path Path to the entity in the space hierarchy.
869
+ /// \param time_columns The time columns to send.
870
+ /// \param component_columns The columns of components to send.
871
+ /// \see `send_columns`
872
+ Error try_send_columns(
873
+ std::string_view entity_path, Collection<TimeColumn> time_columns,
874
+ Collection<ComponentColumn> component_columns
875
+ ) const;
876
+
877
+ /// Set a property of a recording.
878
+ ///
879
+ /// Any failures that may occur during serialization are handled with `Error::handle`.
880
+ ///
881
+ /// \param name The name of the property.
882
+ /// \param values The values of the property.
883
+ /// \see `try_send_property`
884
+ template <typename... Ts>
885
+ void send_property(std::string_view name, const Ts&... values) const {
886
+ try_send_property(name, values...).handle();
887
+ }
888
+
889
+ /// Set a property of a recording.
890
+ ///
891
+ /// Any failures that may occur during serialization are handled with `Error::handle`.
892
+ ///
893
+ /// \param name The name of the property.
894
+ /// \param values The values of the property.
895
+ /// \see `set_property`
896
+ template <typename... Ts>
897
+ Error try_send_property(std::string_view name, const Ts&... values) const {
898
+ return try_log_static(
899
+ this->PROPERTIES_ENTITY_PATH + std::string(name),
900
+ values... // NOLINT
901
+ );
902
+ }
903
+
904
+ /// Set the name of a recording.
905
+ ///
906
+ /// Any failures that may occur during serialization are handled with `Error::handle`.
907
+ ///
908
+ /// \param name The name of the recording.
909
+ /// \see `try_send_recording_name`
910
+ void send_recording_name(std::string_view name) const {
911
+ try_send_recording_name(name).handle();
912
+ }
913
+
914
+ /// Set the name of a recording.
915
+ ///
916
+ /// \param name The name of the recording.
917
+ /// \see `send_recording_name`
918
+ Error try_send_recording_name(std::string_view name) const;
919
+
920
+ /// Set the start time of a recording.
921
+ ///
922
+ /// Any failures that may occur during serialization are handled with `Error::handle`.
923
+ ///
924
+ /// \param nanos The timestamp of the recording in nanoseconds since Unix epoch.
925
+ /// \see `try_send_recording_start_time`
926
+ void send_recording_start_time_nanos(int64_t nanos) const {
927
+ try_send_recording_start_time_nanos(nanos).handle();
928
+ }
929
+
930
+ /// Set the start time of a recording.
931
+ ///
932
+ /// \param nanos The timestamp of the recording in nanoseconds since Unix epoch.
933
+ /// \see `set_name`
934
+ Error try_send_recording_start_time_nanos(int64_t nanos) const;
935
+
936
+ /// @}
937
+
938
+ private:
939
+ // Utility function to implement `try_send_columns` variadic template.
940
+ static void push_back_columns(
941
+ std::vector<ComponentColumn>& component_columns, Collection<ComponentColumn> new_columns
942
+ ) {
943
+ for (const auto& new_column : new_columns) {
944
+ component_columns.emplace_back(std::move(new_column));
945
+ }
946
+ }
947
+
948
+ static void push_back_columns(
949
+ std::vector<ComponentColumn>& component_columns, ComponentColumn new_column
950
+ ) {
951
+ component_columns.emplace_back(std::move(new_column));
952
+ }
953
+
954
+ RecordingStream(uint32_t id, StoreKind store_kind);
955
+
956
+ uint32_t _id;
957
+ StoreKind _store_kind;
958
+ bool _enabled;
959
+ };
960
+ } // namespace rerun