pymomentum-cpu 0.1.77.post30__cp313-cp313-manylinux_2_39_x86_64.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.
- include/axel/BoundingBox.h +58 -0
- include/axel/Bvh.h +708 -0
- include/axel/BvhBase.h +75 -0
- include/axel/BvhCommon.h +43 -0
- include/axel/BvhEmbree.h +86 -0
- include/axel/BvhFactory.h +34 -0
- include/axel/Checks.h +21 -0
- include/axel/DualContouring.h +79 -0
- include/axel/KdTree.h +199 -0
- include/axel/Log.h +22 -0
- include/axel/MeshToSdf.h +123 -0
- include/axel/Profile.h +64 -0
- include/axel/Ray.h +45 -0
- include/axel/SignedDistanceField.h +248 -0
- include/axel/SimdKdTree.h +515 -0
- include/axel/TriBvh.h +157 -0
- include/axel/TriBvhEmbree.h +57 -0
- include/axel/common/Constants.h +27 -0
- include/axel/common/Types.h +21 -0
- include/axel/common/VectorizationTypes.h +58 -0
- include/axel/math/BoundingBoxUtils.h +54 -0
- include/axel/math/ContinuousCollisionDetection.h +48 -0
- include/axel/math/CoplanarityCheck.h +30 -0
- include/axel/math/EdgeEdgeDistance.h +31 -0
- include/axel/math/MeshHoleFilling.h +117 -0
- include/axel/math/PointTriangleProjection.h +34 -0
- include/axel/math/PointTriangleProjectionDefinitions.h +209 -0
- include/axel/math/RayTriangleIntersection.h +36 -0
- include/momentum/character/blend_shape.h +91 -0
- include/momentum/character/blend_shape_base.h +70 -0
- include/momentum/character/blend_shape_skinning.h +96 -0
- include/momentum/character/character.h +272 -0
- include/momentum/character/character_state.h +108 -0
- include/momentum/character/character_utility.h +128 -0
- include/momentum/character/collision_geometry.h +80 -0
- include/momentum/character/collision_geometry_state.h +130 -0
- include/momentum/character/fwd.h +262 -0
- include/momentum/character/inverse_parameter_transform.h +58 -0
- include/momentum/character/joint.h +82 -0
- include/momentum/character/joint_state.h +241 -0
- include/momentum/character/linear_skinning.h +139 -0
- include/momentum/character/locator.h +82 -0
- include/momentum/character/locator_state.h +43 -0
- include/momentum/character/marker.h +48 -0
- include/momentum/character/mesh_state.h +71 -0
- include/momentum/character/parameter_limits.h +144 -0
- include/momentum/character/parameter_transform.h +250 -0
- include/momentum/character/pose_shape.h +65 -0
- include/momentum/character/skeleton.h +85 -0
- include/momentum/character/skeleton_state.h +181 -0
- include/momentum/character/skeleton_utility.h +38 -0
- include/momentum/character/skin_weights.h +67 -0
- include/momentum/character/skinned_locator.h +80 -0
- include/momentum/character/types.h +202 -0
- include/momentum/character_sequence_solver/fwd.h +200 -0
- include/momentum/character_sequence_solver/model_parameters_sequence_error_function.h +65 -0
- include/momentum/character_sequence_solver/multipose_solver.h +65 -0
- include/momentum/character_sequence_solver/multipose_solver_function.h +82 -0
- include/momentum/character_sequence_solver/sequence_error_function.h +104 -0
- include/momentum/character_sequence_solver/sequence_solver.h +144 -0
- include/momentum/character_sequence_solver/sequence_solver_function.h +134 -0
- include/momentum/character_sequence_solver/state_sequence_error_function.h +109 -0
- include/momentum/character_sequence_solver/vertex_sequence_error_function.h +128 -0
- include/momentum/character_solver/aim_error_function.h +112 -0
- include/momentum/character_solver/collision_error_function.h +92 -0
- include/momentum/character_solver/collision_error_function_stateless.h +75 -0
- include/momentum/character_solver/constraint_error_function-inl.h +324 -0
- include/momentum/character_solver/constraint_error_function.h +248 -0
- include/momentum/character_solver/distance_error_function.h +77 -0
- include/momentum/character_solver/error_function_utils.h +60 -0
- include/momentum/character_solver/fixed_axis_error_function.h +139 -0
- include/momentum/character_solver/fwd.h +924 -0
- include/momentum/character_solver/gauss_newton_solver_qr.h +64 -0
- include/momentum/character_solver/limit_error_function.h +57 -0
- include/momentum/character_solver/model_parameters_error_function.h +64 -0
- include/momentum/character_solver/normal_error_function.h +73 -0
- include/momentum/character_solver/orientation_error_function.h +74 -0
- include/momentum/character_solver/plane_error_function.h +102 -0
- include/momentum/character_solver/point_triangle_vertex_error_function.h +141 -0
- include/momentum/character_solver/pose_prior_error_function.h +80 -0
- include/momentum/character_solver/position_error_function.h +75 -0
- include/momentum/character_solver/projection_error_function.h +93 -0
- include/momentum/character_solver/simd_collision_error_function.h +99 -0
- include/momentum/character_solver/simd_normal_error_function.h +157 -0
- include/momentum/character_solver/simd_plane_error_function.h +164 -0
- include/momentum/character_solver/simd_position_error_function.h +165 -0
- include/momentum/character_solver/skeleton_error_function.h +151 -0
- include/momentum/character_solver/skeleton_solver_function.h +94 -0
- include/momentum/character_solver/skinned_locator_error_function.h +166 -0
- include/momentum/character_solver/skinned_locator_triangle_error_function.h +146 -0
- include/momentum/character_solver/skinning_weight_iterator.h +80 -0
- include/momentum/character_solver/state_error_function.h +94 -0
- include/momentum/character_solver/transform_pose.h +80 -0
- include/momentum/character_solver/trust_region_qr.h +80 -0
- include/momentum/character_solver/vertex_error_function.h +155 -0
- include/momentum/character_solver/vertex_projection_error_function.h +126 -0
- include/momentum/character_solver/vertex_vertex_distance_error_function.h +151 -0
- include/momentum/common/aligned.h +155 -0
- include/momentum/common/checks.h +27 -0
- include/momentum/common/exception.h +70 -0
- include/momentum/common/filesystem.h +20 -0
- include/momentum/common/fwd.h +27 -0
- include/momentum/common/log.h +173 -0
- include/momentum/common/log_channel.h +17 -0
- include/momentum/common/memory.h +71 -0
- include/momentum/common/profile.h +79 -0
- include/momentum/common/progress_bar.h +37 -0
- include/momentum/common/string.h +52 -0
- include/momentum/diff_ik/ceres_utility.h +73 -0
- include/momentum/diff_ik/fully_differentiable_body_ik.h +58 -0
- include/momentum/diff_ik/fully_differentiable_distance_error_function.h +69 -0
- include/momentum/diff_ik/fully_differentiable_motion_error_function.h +46 -0
- include/momentum/diff_ik/fully_differentiable_orientation_error_function.h +114 -0
- include/momentum/diff_ik/fully_differentiable_pose_prior_error_function.h +76 -0
- include/momentum/diff_ik/fully_differentiable_position_error_function.h +138 -0
- include/momentum/diff_ik/fully_differentiable_projection_error_function.h +65 -0
- include/momentum/diff_ik/fully_differentiable_skeleton_error_function.h +160 -0
- include/momentum/diff_ik/fully_differentiable_state_error_function.h +54 -0
- include/momentum/diff_ik/fwd.h +385 -0
- include/momentum/diff_ik/union_error_function.h +67 -0
- include/momentum/gui/rerun/eigen_adapters.h +70 -0
- include/momentum/gui/rerun/logger.h +102 -0
- include/momentum/gui/rerun/logging_redirect.h +27 -0
- include/momentum/io/character_io.h +56 -0
- include/momentum/io/common/gsl_utils.h +50 -0
- include/momentum/io/common/stream_utils.h +65 -0
- include/momentum/io/fbx/fbx_io.h +109 -0
- include/momentum/io/fbx/fbx_memory_stream.h +66 -0
- include/momentum/io/fbx/openfbx_loader.h +49 -0
- include/momentum/io/fbx/polygon_data.h +60 -0
- include/momentum/io/gltf/gltf_builder.h +132 -0
- include/momentum/io/gltf/gltf_file_format.h +19 -0
- include/momentum/io/gltf/gltf_io.h +148 -0
- include/momentum/io/gltf/utils/accessor_utils.h +299 -0
- include/momentum/io/gltf/utils/coordinate_utils.h +60 -0
- include/momentum/io/gltf/utils/json_utils.h +102 -0
- include/momentum/io/legacy_json/legacy_json_io.h +70 -0
- include/momentum/io/marker/c3d_io.h +29 -0
- include/momentum/io/marker/conversions.h +57 -0
- include/momentum/io/marker/coordinate_system.h +30 -0
- include/momentum/io/marker/marker_io.h +54 -0
- include/momentum/io/marker/trc_io.h +27 -0
- include/momentum/io/motion/mmo_io.h +97 -0
- include/momentum/io/shape/blend_shape_io.h +70 -0
- include/momentum/io/shape/pose_shape_io.h +21 -0
- include/momentum/io/skeleton/locator_io.h +41 -0
- include/momentum/io/skeleton/mppca_io.h +26 -0
- include/momentum/io/skeleton/parameter_limits_io.h +25 -0
- include/momentum/io/skeleton/parameter_transform_io.h +41 -0
- include/momentum/io/skeleton/parameters_io.h +20 -0
- include/momentum/io/urdf/urdf_io.h +26 -0
- include/momentum/io/usd/usd_io.h +36 -0
- include/momentum/marker_tracking/app_utils.h +62 -0
- include/momentum/marker_tracking/marker_tracker.h +213 -0
- include/momentum/marker_tracking/process_markers.h +58 -0
- include/momentum/marker_tracking/tracker_utils.h +90 -0
- include/momentum/math/constants.h +82 -0
- include/momentum/math/covariance_matrix.h +84 -0
- include/momentum/math/fmt_eigen.h +23 -0
- include/momentum/math/fwd.h +132 -0
- include/momentum/math/generalized_loss.h +61 -0
- include/momentum/math/intersection.h +32 -0
- include/momentum/math/mesh.h +84 -0
- include/momentum/math/mppca.h +67 -0
- include/momentum/math/online_householder_qr.h +516 -0
- include/momentum/math/random-inl.h +404 -0
- include/momentum/math/random.h +310 -0
- include/momentum/math/simd_generalized_loss.h +40 -0
- include/momentum/math/transform.h +229 -0
- include/momentum/math/types.h +461 -0
- include/momentum/math/utility.h +251 -0
- include/momentum/rasterizer/camera.h +453 -0
- include/momentum/rasterizer/fwd.h +102 -0
- include/momentum/rasterizer/geometry.h +83 -0
- include/momentum/rasterizer/image.h +18 -0
- include/momentum/rasterizer/rasterizer.h +583 -0
- include/momentum/rasterizer/tensor.h +140 -0
- include/momentum/rasterizer/utility.h +268 -0
- include/momentum/simd/simd.h +221 -0
- include/momentum/solver/fwd.h +131 -0
- include/momentum/solver/gauss_newton_solver.h +136 -0
- include/momentum/solver/gradient_descent_solver.h +65 -0
- include/momentum/solver/solver.h +155 -0
- include/momentum/solver/solver_function.h +126 -0
- include/momentum/solver/subset_gauss_newton_solver.h +109 -0
- include/rerun/archetypes/annotation_context.hpp +157 -0
- include/rerun/archetypes/arrows2d.hpp +271 -0
- include/rerun/archetypes/arrows3d.hpp +257 -0
- include/rerun/archetypes/asset3d.hpp +262 -0
- include/rerun/archetypes/asset_video.hpp +275 -0
- include/rerun/archetypes/bar_chart.hpp +261 -0
- include/rerun/archetypes/boxes2d.hpp +293 -0
- include/rerun/archetypes/boxes3d.hpp +369 -0
- include/rerun/archetypes/capsules3d.hpp +333 -0
- include/rerun/archetypes/clear.hpp +180 -0
- include/rerun/archetypes/depth_image.hpp +425 -0
- include/rerun/archetypes/ellipsoids3d.hpp +384 -0
- include/rerun/archetypes/encoded_image.hpp +250 -0
- include/rerun/archetypes/geo_line_strings.hpp +166 -0
- include/rerun/archetypes/geo_points.hpp +177 -0
- include/rerun/archetypes/graph_edges.hpp +152 -0
- include/rerun/archetypes/graph_nodes.hpp +206 -0
- include/rerun/archetypes/image.hpp +434 -0
- include/rerun/archetypes/instance_poses3d.hpp +221 -0
- include/rerun/archetypes/line_strips2d.hpp +289 -0
- include/rerun/archetypes/line_strips3d.hpp +270 -0
- include/rerun/archetypes/mesh3d.hpp +387 -0
- include/rerun/archetypes/pinhole.hpp +385 -0
- include/rerun/archetypes/points2d.hpp +333 -0
- include/rerun/archetypes/points3d.hpp +369 -0
- include/rerun/archetypes/recording_properties.hpp +132 -0
- include/rerun/archetypes/scalar.hpp +170 -0
- include/rerun/archetypes/scalars.hpp +153 -0
- include/rerun/archetypes/segmentation_image.hpp +305 -0
- include/rerun/archetypes/series_line.hpp +274 -0
- include/rerun/archetypes/series_lines.hpp +271 -0
- include/rerun/archetypes/series_point.hpp +265 -0
- include/rerun/archetypes/series_points.hpp +251 -0
- include/rerun/archetypes/tensor.hpp +213 -0
- include/rerun/archetypes/text_document.hpp +200 -0
- include/rerun/archetypes/text_log.hpp +211 -0
- include/rerun/archetypes/transform3d.hpp +925 -0
- include/rerun/archetypes/video_frame_reference.hpp +295 -0
- include/rerun/archetypes/view_coordinates.hpp +393 -0
- include/rerun/archetypes.hpp +43 -0
- include/rerun/arrow_utils.hpp +32 -0
- include/rerun/as_components.hpp +90 -0
- include/rerun/blueprint/archetypes/background.hpp +113 -0
- include/rerun/blueprint/archetypes/container_blueprint.hpp +259 -0
- include/rerun/blueprint/archetypes/dataframe_query.hpp +178 -0
- include/rerun/blueprint/archetypes/entity_behavior.hpp +130 -0
- include/rerun/blueprint/archetypes/force_center.hpp +115 -0
- include/rerun/blueprint/archetypes/force_collision_radius.hpp +141 -0
- include/rerun/blueprint/archetypes/force_link.hpp +136 -0
- include/rerun/blueprint/archetypes/force_many_body.hpp +124 -0
- include/rerun/blueprint/archetypes/force_position.hpp +132 -0
- include/rerun/blueprint/archetypes/line_grid3d.hpp +178 -0
- include/rerun/blueprint/archetypes/map_background.hpp +104 -0
- include/rerun/blueprint/archetypes/map_zoom.hpp +103 -0
- include/rerun/blueprint/archetypes/near_clip_plane.hpp +109 -0
- include/rerun/blueprint/archetypes/panel_blueprint.hpp +95 -0
- include/rerun/blueprint/archetypes/plot_legend.hpp +118 -0
- include/rerun/blueprint/archetypes/scalar_axis.hpp +116 -0
- include/rerun/blueprint/archetypes/tensor_scalar_mapping.hpp +146 -0
- include/rerun/blueprint/archetypes/tensor_slice_selection.hpp +167 -0
- include/rerun/blueprint/archetypes/tensor_view_fit.hpp +95 -0
- include/rerun/blueprint/archetypes/view_blueprint.hpp +170 -0
- include/rerun/blueprint/archetypes/view_contents.hpp +142 -0
- include/rerun/blueprint/archetypes/viewport_blueprint.hpp +200 -0
- include/rerun/blueprint/archetypes/visible_time_ranges.hpp +116 -0
- include/rerun/blueprint/archetypes/visual_bounds2d.hpp +109 -0
- include/rerun/blueprint/archetypes/visualizer_overrides.hpp +113 -0
- include/rerun/blueprint/archetypes.hpp +29 -0
- include/rerun/blueprint/components/active_tab.hpp +82 -0
- include/rerun/blueprint/components/apply_latest_at.hpp +79 -0
- include/rerun/blueprint/components/auto_layout.hpp +77 -0
- include/rerun/blueprint/components/auto_views.hpp +77 -0
- include/rerun/blueprint/components/background_kind.hpp +66 -0
- include/rerun/blueprint/components/column_share.hpp +78 -0
- include/rerun/blueprint/components/component_column_selector.hpp +81 -0
- include/rerun/blueprint/components/container_kind.hpp +65 -0
- include/rerun/blueprint/components/corner2d.hpp +64 -0
- include/rerun/blueprint/components/enabled.hpp +77 -0
- include/rerun/blueprint/components/filter_by_range.hpp +74 -0
- include/rerun/blueprint/components/filter_is_not_null.hpp +77 -0
- include/rerun/blueprint/components/force_distance.hpp +82 -0
- include/rerun/blueprint/components/force_iterations.hpp +82 -0
- include/rerun/blueprint/components/force_strength.hpp +82 -0
- include/rerun/blueprint/components/grid_columns.hpp +78 -0
- include/rerun/blueprint/components/grid_spacing.hpp +78 -0
- include/rerun/blueprint/components/included_content.hpp +86 -0
- include/rerun/blueprint/components/lock_range_during_zoom.hpp +82 -0
- include/rerun/blueprint/components/map_provider.hpp +64 -0
- include/rerun/blueprint/components/near_clip_plane.hpp +82 -0
- include/rerun/blueprint/components/panel_state.hpp +61 -0
- include/rerun/blueprint/components/query_expression.hpp +89 -0
- include/rerun/blueprint/components/root_container.hpp +77 -0
- include/rerun/blueprint/components/row_share.hpp +78 -0
- include/rerun/blueprint/components/selected_columns.hpp +76 -0
- include/rerun/blueprint/components/tensor_dimension_index_slider.hpp +90 -0
- include/rerun/blueprint/components/timeline_name.hpp +76 -0
- include/rerun/blueprint/components/view_class.hpp +76 -0
- include/rerun/blueprint/components/view_fit.hpp +61 -0
- include/rerun/blueprint/components/view_maximized.hpp +79 -0
- include/rerun/blueprint/components/view_origin.hpp +81 -0
- include/rerun/blueprint/components/viewer_recommendation_hash.hpp +82 -0
- include/rerun/blueprint/components/visible_time_range.hpp +77 -0
- include/rerun/blueprint/components/visual_bounds2d.hpp +74 -0
- include/rerun/blueprint/components/visualizer_override.hpp +86 -0
- include/rerun/blueprint/components/zoom_level.hpp +78 -0
- include/rerun/blueprint/components.hpp +41 -0
- include/rerun/blueprint/datatypes/component_column_selector.hpp +61 -0
- include/rerun/blueprint/datatypes/filter_by_range.hpp +59 -0
- include/rerun/blueprint/datatypes/filter_is_not_null.hpp +61 -0
- include/rerun/blueprint/datatypes/selected_columns.hpp +62 -0
- include/rerun/blueprint/datatypes/tensor_dimension_index_slider.hpp +63 -0
- include/rerun/blueprint/datatypes.hpp +9 -0
- include/rerun/c/arrow_c_data_interface.h +111 -0
- include/rerun/c/compiler_utils.h +10 -0
- include/rerun/c/rerun.h +627 -0
- include/rerun/c/sdk_info.h +28 -0
- include/rerun/collection.hpp +496 -0
- include/rerun/collection_adapter.hpp +43 -0
- include/rerun/collection_adapter_builtins.hpp +138 -0
- include/rerun/compiler_utils.hpp +61 -0
- include/rerun/component_batch.hpp +163 -0
- include/rerun/component_column.hpp +111 -0
- include/rerun/component_descriptor.hpp +142 -0
- include/rerun/component_type.hpp +35 -0
- include/rerun/components/aggregation_policy.hpp +76 -0
- include/rerun/components/albedo_factor.hpp +74 -0
- include/rerun/components/annotation_context.hpp +102 -0
- include/rerun/components/axis_length.hpp +74 -0
- include/rerun/components/blob.hpp +73 -0
- include/rerun/components/class_id.hpp +71 -0
- include/rerun/components/clear_is_recursive.hpp +75 -0
- include/rerun/components/color.hpp +99 -0
- include/rerun/components/colormap.hpp +99 -0
- include/rerun/components/depth_meter.hpp +84 -0
- include/rerun/components/draw_order.hpp +79 -0
- include/rerun/components/entity_path.hpp +83 -0
- include/rerun/components/fill_mode.hpp +72 -0
- include/rerun/components/fill_ratio.hpp +79 -0
- include/rerun/components/gamma_correction.hpp +80 -0
- include/rerun/components/geo_line_string.hpp +63 -0
- include/rerun/components/graph_edge.hpp +75 -0
- include/rerun/components/graph_node.hpp +79 -0
- include/rerun/components/graph_type.hpp +57 -0
- include/rerun/components/half_size2d.hpp +91 -0
- include/rerun/components/half_size3d.hpp +95 -0
- include/rerun/components/image_buffer.hpp +86 -0
- include/rerun/components/image_format.hpp +84 -0
- include/rerun/components/image_plane_distance.hpp +77 -0
- include/rerun/components/interactive.hpp +76 -0
- include/rerun/components/keypoint_id.hpp +74 -0
- include/rerun/components/lat_lon.hpp +89 -0
- include/rerun/components/length.hpp +77 -0
- include/rerun/components/line_strip2d.hpp +73 -0
- include/rerun/components/line_strip3d.hpp +73 -0
- include/rerun/components/magnification_filter.hpp +63 -0
- include/rerun/components/marker_shape.hpp +82 -0
- include/rerun/components/marker_size.hpp +74 -0
- include/rerun/components/media_type.hpp +157 -0
- include/rerun/components/name.hpp +83 -0
- include/rerun/components/opacity.hpp +77 -0
- include/rerun/components/pinhole_projection.hpp +94 -0
- include/rerun/components/plane3d.hpp +75 -0
- include/rerun/components/pose_rotation_axis_angle.hpp +73 -0
- include/rerun/components/pose_rotation_quat.hpp +71 -0
- include/rerun/components/pose_scale3d.hpp +102 -0
- include/rerun/components/pose_transform_mat3x3.hpp +87 -0
- include/rerun/components/pose_translation3d.hpp +96 -0
- include/rerun/components/position2d.hpp +86 -0
- include/rerun/components/position3d.hpp +90 -0
- include/rerun/components/radius.hpp +98 -0
- include/rerun/components/range1d.hpp +75 -0
- include/rerun/components/resolution.hpp +88 -0
- include/rerun/components/rotation_axis_angle.hpp +72 -0
- include/rerun/components/rotation_quat.hpp +71 -0
- include/rerun/components/scalar.hpp +76 -0
- include/rerun/components/scale3d.hpp +102 -0
- include/rerun/components/series_visible.hpp +76 -0
- include/rerun/components/show_labels.hpp +79 -0
- include/rerun/components/stroke_width.hpp +74 -0
- include/rerun/components/tensor_data.hpp +94 -0
- include/rerun/components/tensor_dimension_index_selection.hpp +77 -0
- include/rerun/components/tensor_height_dimension.hpp +71 -0
- include/rerun/components/tensor_width_dimension.hpp +71 -0
- include/rerun/components/texcoord2d.hpp +101 -0
- include/rerun/components/text.hpp +83 -0
- include/rerun/components/text_log_level.hpp +110 -0
- include/rerun/components/timestamp.hpp +76 -0
- include/rerun/components/transform_mat3x3.hpp +92 -0
- include/rerun/components/transform_relation.hpp +66 -0
- include/rerun/components/translation3d.hpp +96 -0
- include/rerun/components/triangle_indices.hpp +85 -0
- include/rerun/components/value_range.hpp +78 -0
- include/rerun/components/vector2d.hpp +92 -0
- include/rerun/components/vector3d.hpp +96 -0
- include/rerun/components/video_timestamp.hpp +120 -0
- include/rerun/components/view_coordinates.hpp +346 -0
- include/rerun/components/visible.hpp +74 -0
- include/rerun/components.hpp +77 -0
- include/rerun/config.hpp +52 -0
- include/rerun/datatypes/angle.hpp +76 -0
- include/rerun/datatypes/annotation_info.hpp +76 -0
- include/rerun/datatypes/blob.hpp +67 -0
- include/rerun/datatypes/bool.hpp +57 -0
- include/rerun/datatypes/channel_datatype.hpp +87 -0
- include/rerun/datatypes/class_description.hpp +92 -0
- include/rerun/datatypes/class_description_map_elem.hpp +69 -0
- include/rerun/datatypes/class_id.hpp +62 -0
- include/rerun/datatypes/color_model.hpp +68 -0
- include/rerun/datatypes/dvec2d.hpp +76 -0
- include/rerun/datatypes/entity_path.hpp +60 -0
- include/rerun/datatypes/float32.hpp +62 -0
- include/rerun/datatypes/float64.hpp +62 -0
- include/rerun/datatypes/image_format.hpp +107 -0
- include/rerun/datatypes/keypoint_id.hpp +63 -0
- include/rerun/datatypes/keypoint_pair.hpp +65 -0
- include/rerun/datatypes/mat3x3.hpp +105 -0
- include/rerun/datatypes/mat4x4.hpp +119 -0
- include/rerun/datatypes/pixel_format.hpp +142 -0
- include/rerun/datatypes/plane3d.hpp +60 -0
- include/rerun/datatypes/quaternion.hpp +110 -0
- include/rerun/datatypes/range1d.hpp +59 -0
- include/rerun/datatypes/range2d.hpp +55 -0
- include/rerun/datatypes/rgba32.hpp +94 -0
- include/rerun/datatypes/rotation_axis_angle.hpp +67 -0
- include/rerun/datatypes/tensor_buffer.hpp +529 -0
- include/rerun/datatypes/tensor_data.hpp +100 -0
- include/rerun/datatypes/tensor_dimension_index_selection.hpp +58 -0
- include/rerun/datatypes/tensor_dimension_selection.hpp +56 -0
- include/rerun/datatypes/time_int.hpp +62 -0
- include/rerun/datatypes/time_range.hpp +55 -0
- include/rerun/datatypes/time_range_boundary.hpp +175 -0
- include/rerun/datatypes/uint16.hpp +62 -0
- include/rerun/datatypes/uint32.hpp +62 -0
- include/rerun/datatypes/uint64.hpp +62 -0
- include/rerun/datatypes/utf8.hpp +76 -0
- include/rerun/datatypes/utf8pair.hpp +62 -0
- include/rerun/datatypes/uuid.hpp +60 -0
- include/rerun/datatypes/uvec2d.hpp +76 -0
- include/rerun/datatypes/uvec3d.hpp +80 -0
- include/rerun/datatypes/uvec4d.hpp +59 -0
- include/rerun/datatypes/vec2d.hpp +76 -0
- include/rerun/datatypes/vec3d.hpp +80 -0
- include/rerun/datatypes/vec4d.hpp +84 -0
- include/rerun/datatypes/video_timestamp.hpp +67 -0
- include/rerun/datatypes/view_coordinates.hpp +87 -0
- include/rerun/datatypes/visible_time_range.hpp +57 -0
- include/rerun/datatypes.hpp +51 -0
- include/rerun/demo_utils.hpp +75 -0
- include/rerun/entity_path.hpp +20 -0
- include/rerun/error.hpp +180 -0
- include/rerun/half.hpp +10 -0
- include/rerun/image_utils.hpp +187 -0
- include/rerun/indicator_component.hpp +59 -0
- include/rerun/loggable.hpp +54 -0
- include/rerun/recording_stream.hpp +960 -0
- include/rerun/rerun_sdk_export.hpp +25 -0
- include/rerun/result.hpp +86 -0
- include/rerun/rotation3d.hpp +33 -0
- include/rerun/sdk_info.hpp +20 -0
- include/rerun/spawn.hpp +21 -0
- include/rerun/spawn_options.hpp +57 -0
- include/rerun/string_utils.hpp +16 -0
- include/rerun/third_party/cxxopts.hpp +2198 -0
- include/rerun/time_column.hpp +288 -0
- include/rerun/timeline.hpp +38 -0
- include/rerun/type_traits.hpp +40 -0
- include/rerun.hpp +86 -0
- lib/cmake/rerun_sdk/rerun_sdkConfig.cmake +70 -0
- lib/cmake/rerun_sdk/rerun_sdkConfigVersion.cmake +83 -0
- lib/cmake/rerun_sdk/rerun_sdkTargets-release.cmake +19 -0
- lib/cmake/rerun_sdk/rerun_sdkTargets.cmake +108 -0
- lib/libarrow.a +0 -0
- lib/libarrow_bundled_dependencies.a +0 -0
- lib/librerun_c__linux_x64.a +0 -0
- lib/librerun_sdk.a +0 -0
- lib64/cmake/axel/axel-config.cmake +45 -0
- lib64/cmake/axel/axelTargets-release.cmake +19 -0
- lib64/cmake/axel/axelTargets.cmake +108 -0
- lib64/cmake/momentum/Findre2.cmake +52 -0
- lib64/cmake/momentum/momentum-config.cmake +67 -0
- lib64/cmake/momentum/momentumTargets-release.cmake +259 -0
- lib64/cmake/momentum/momentumTargets.cmake +377 -0
- lib64/libaxel.a +0 -0
- lib64/libmomentum_app_utils.a +0 -0
- lib64/libmomentum_character.a +0 -0
- lib64/libmomentum_character_sequence_solver.a +0 -0
- lib64/libmomentum_character_solver.a +0 -0
- lib64/libmomentum_common.a +0 -0
- lib64/libmomentum_diff_ik.a +0 -0
- lib64/libmomentum_io.a +0 -0
- lib64/libmomentum_io_common.a +0 -0
- lib64/libmomentum_io_fbx.a +0 -0
- lib64/libmomentum_io_gltf.a +0 -0
- lib64/libmomentum_io_legacy_json.a +0 -0
- lib64/libmomentum_io_marker.a +0 -0
- lib64/libmomentum_io_motion.a +0 -0
- lib64/libmomentum_io_shape.a +0 -0
- lib64/libmomentum_io_skeleton.a +0 -0
- lib64/libmomentum_io_urdf.a +0 -0
- lib64/libmomentum_marker_tracker.a +0 -0
- lib64/libmomentum_math.a +0 -0
- lib64/libmomentum_online_qr.a +0 -0
- lib64/libmomentum_process_markers.a +0 -0
- lib64/libmomentum_rerun.a +0 -0
- lib64/libmomentum_simd_constraints.a +0 -0
- lib64/libmomentum_simd_generalized_loss.a +0 -0
- lib64/libmomentum_skeleton.a +0 -0
- lib64/libmomentum_solver.a +0 -0
- pymomentum/axel.cpython-313-x86_64-linux-gnu.so +0 -0
- pymomentum/backend/__init__.py +16 -0
- pymomentum/backend/skel_state_backend.py +614 -0
- pymomentum/backend/trs_backend.py +871 -0
- pymomentum/backend/utils.py +224 -0
- pymomentum/geometry.cpython-313-x86_64-linux-gnu.so +0 -0
- pymomentum/marker_tracking.cpython-313-x86_64-linux-gnu.so +0 -0
- pymomentum/quaternion.py +740 -0
- pymomentum/skel_state.py +514 -0
- pymomentum/solver.cpython-313-x86_64-linux-gnu.so +0 -0
- pymomentum/solver2.cpython-313-x86_64-linux-gnu.so +0 -0
- pymomentum/torch/character.py +809 -0
- pymomentum/torch/parameter_limits.py +494 -0
- pymomentum/torch/utility.py +20 -0
- pymomentum/trs.py +535 -0
- pymomentum_cpu-0.1.77.post30.dist-info/METADATA +208 -0
- pymomentum_cpu-0.1.77.post30.dist-info/RECORD +555 -0
- pymomentum_cpu-0.1.77.post30.dist-info/WHEEL +5 -0
- pymomentum_cpu-0.1.77.post30.dist-info/licenses/LICENSE +21 -0
- pymomentum_cpu.libs/libabsl_base-86f3b38c.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_city-31b65ca2.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_debugging_internal-38680253.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_decode_rust_punycode-750652c3.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_demangle_internal-9a0351a3.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_demangle_rust-71629506.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_examine_stack-57661ecd.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_hash-8c523b7e.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_hashtablez_sampler-b5c3e343.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_int128-295bfed5.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_kernel_timeout_internal-29296ac1.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_globals-6cfa8af5.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_format-a5c79460.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_globals-481e9a7c.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_log_sink_set-ac08f942.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_message-7dfe150a.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_nullguard-883adc72.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_proto-a5da8c75.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_structured_proto-e601fd9b.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_sink-894261b2.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_low_level_hash-a3284638.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_malloc_internal-814569de.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_raw_hash_set-922d64ad.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_raw_logging_internal-477f78ec.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_spinlock_wait-8b85a473.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_stacktrace-7369e71d.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_str_format_internal-98de729d.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_strerror-39a52998.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_strings-a57d5127.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_strings_internal-ed8c7c0d.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_symbolize-eba17dd1.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_synchronization-2f8cf326.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_time-066c0dde.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_time_zone-72867365.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_tracing_internal-021e37ee.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_utf8_for_code_point-de2a4d4a.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libconsole_bridge-f26e11cc.so.1.0 +0 -0
- pymomentum_cpu.libs/libdeflate-577b71e3.so.0 +0 -0
- pymomentum_cpu.libs/libdispenso-67ac1721.so.1.4.0 +0 -0
- pymomentum_cpu.libs/libezc3d-4a95ab2c.so +0 -0
- pymomentum_cpu.libs/libre2-985fb83c.so.11 +0 -0
- pymomentum_cpu.libs/libtinyxml2-8d10763c.so.11.0.0 +0 -0
- pymomentum_cpu.libs/liburdfdom_model-7b26ae88.so.4.0 +0 -0
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* 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
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <memory>
|
|
11
|
+
#include <vector>
|
|
12
|
+
|
|
13
|
+
#include <Eigen/Core>
|
|
14
|
+
#include <Eigen/Geometry>
|
|
15
|
+
#include <gsl/span>
|
|
16
|
+
|
|
17
|
+
#ifdef AXEL_ENABLE_AVX
|
|
18
|
+
#include <immintrin.h>
|
|
19
|
+
#include <xmmintrin.h>
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
#include <axel/Checks.h>
|
|
23
|
+
|
|
24
|
+
// TODO: Keeping this temporarily
|
|
25
|
+
#define AXEL_DEFINE_POINTERS(x) \
|
|
26
|
+
using x##_p = ::std::shared_ptr<x>; \
|
|
27
|
+
using x##_u = ::std::unique_ptr<x>; \
|
|
28
|
+
using x##_w = ::std::weak_ptr<x>; \
|
|
29
|
+
using x##_const_p = ::std::shared_ptr<const x>; \
|
|
30
|
+
using x##_const_u = ::std::unique_ptr<const x>; \
|
|
31
|
+
using x##_const_w = ::std::weak_ptr<const x>;
|
|
32
|
+
|
|
33
|
+
namespace axel {
|
|
34
|
+
|
|
35
|
+
/// A k-d tree is a spatial data structure that supports fast nearest-points lookup.
|
|
36
|
+
///
|
|
37
|
+
/// For details, see: http://en.wikipedia.org/wiki/k-d_tree
|
|
38
|
+
///
|
|
39
|
+
/// This particular k-d tree is a bit unusual, in that it only stores points at the leaf nodes. This
|
|
40
|
+
/// allows some amount of speedup because we can then blast through the points 10 at a time or so,
|
|
41
|
+
/// exploiting cache locality.
|
|
42
|
+
template <int32_t nDim>
|
|
43
|
+
class SimdKdTreef {
|
|
44
|
+
public:
|
|
45
|
+
static constexpr int32_t kDim = nDim;
|
|
46
|
+
static constexpr int32_t kColorDimensions = 4;
|
|
47
|
+
|
|
48
|
+
/// We will use this value for storing the "too far away" distance instead of FLT_MAX because we
|
|
49
|
+
/// can square it and still remain well within the range of acceptable values.
|
|
50
|
+
static constexpr float kFarValueFloat = 1e+10f;
|
|
51
|
+
|
|
52
|
+
using SizeType = int32_t; // We use signed integer indices for easier compatibility with SSE
|
|
53
|
+
using Scalar = float;
|
|
54
|
+
using Vec = Eigen::Matrix<Scalar, kDim, 1>;
|
|
55
|
+
using Col = Eigen::Matrix<Scalar, kColorDimensions, 1>;
|
|
56
|
+
using Box = Eigen::AlignedBox<Scalar, kDim>;
|
|
57
|
+
|
|
58
|
+
/// Limiting the total number of nodes to 2^20 or 1,048,576 to prevent infinite recursion.
|
|
59
|
+
static constexpr SizeType kMaxDepth = 20;
|
|
60
|
+
|
|
61
|
+
/// Constructs k-d tree from points, normals, and colors.
|
|
62
|
+
explicit SimdKdTreef(
|
|
63
|
+
gsl::span<const Vec> points = gsl::span<Vec>{},
|
|
64
|
+
gsl::span<const Vec> normals = gsl::span<Vec>{},
|
|
65
|
+
gsl::span<const Col> colors = gsl::span<Col>{});
|
|
66
|
+
|
|
67
|
+
/// Destructor.
|
|
68
|
+
virtual ~SimdKdTreef();
|
|
69
|
+
|
|
70
|
+
/// Disables copy constructor.
|
|
71
|
+
SimdKdTreef(const SimdKdTreef&) = delete;
|
|
72
|
+
|
|
73
|
+
/// Disables assignment operator.
|
|
74
|
+
SimdKdTreef& operator=(const SimdKdTreef&) = delete;
|
|
75
|
+
|
|
76
|
+
/// Returns (1) whether a point was found, (2) the index of the point, and (3) the squared
|
|
77
|
+
/// distance.
|
|
78
|
+
[[nodiscard]] virtual std::tuple<bool, SizeType, Scalar> closestPoint(
|
|
79
|
+
const Vec& queryPoint,
|
|
80
|
+
Scalar maxSqrDist = std::numeric_limits<Scalar>::max()) const;
|
|
81
|
+
// TODO: Consider making the result as a structure for better readability
|
|
82
|
+
|
|
83
|
+
/// This version of closest points also validates that the normals agree; that is, it won't return
|
|
84
|
+
/// a closest point whose normal dotted with the passed-in normal is negative.
|
|
85
|
+
[[nodiscard]] virtual std::tuple<bool, SizeType, Scalar> closestPoint(
|
|
86
|
+
const Vec& queryPoint,
|
|
87
|
+
const Vec& queryNormal,
|
|
88
|
+
Scalar maxSqrDist = std::numeric_limits<Scalar>::max(),
|
|
89
|
+
Scalar maxNormalDot = 0.0f) const;
|
|
90
|
+
|
|
91
|
+
/// This version of closest points also validates that the normals and colors agree; that is, it
|
|
92
|
+
/// won't return a closest point whose normal dotted with the passed-in normal is negative.
|
|
93
|
+
[[nodiscard]] virtual std::tuple<bool, SizeType, Scalar> closestPoint(
|
|
94
|
+
const Vec& queryPoint,
|
|
95
|
+
const Vec& queryNormal,
|
|
96
|
+
const Col& color,
|
|
97
|
+
Scalar maxSqrDist = std::numeric_limits<Scalar>::max(),
|
|
98
|
+
Scalar maxNormalDot = 0.0f,
|
|
99
|
+
Scalar maxColorSqrDist = 0.5f) const;
|
|
100
|
+
|
|
101
|
+
/// Allows the user to mark out which points are considered 'acceptable.'
|
|
102
|
+
///
|
|
103
|
+
/// The passed-in function should map from a __m256i (the indices) to an __m256i which uses the
|
|
104
|
+
/// standard AVX convention (all ones in the appropriate spots). It also needs to be tolerant to
|
|
105
|
+
/// possible INT_MAX values since we may not have actual indices for all 4 points.
|
|
106
|
+
///
|
|
107
|
+
/// Here's an example acceptance function that looks for odd-valued points:
|
|
108
|
+
/// @code
|
|
109
|
+
/// closestPointWithAcceptance(queryPoint, maxSqrDist, [](SizeType index) -> bool { return !(index
|
|
110
|
+
/// % 2); });
|
|
111
|
+
/// @endcode
|
|
112
|
+
[[nodiscard]] std::tuple<bool, SizeType, Scalar> closestPointWithAcceptance(
|
|
113
|
+
const Vec& queryPoint,
|
|
114
|
+
Scalar maxSqrDist,
|
|
115
|
+
const std::function<bool(SizeType pointIndex)>& acceptanceFunction) const;
|
|
116
|
+
// TODO: Consider take a SIMD version of acceptance function. Currently, non-vectorized function
|
|
117
|
+
// is used.
|
|
118
|
+
|
|
119
|
+
/// Queries a sphere against the tree.
|
|
120
|
+
virtual void pointsInNSphere(const Vec& center, Scalar radius, std::vector<SizeType>& points)
|
|
121
|
+
const;
|
|
122
|
+
|
|
123
|
+
/// Returns whether this tree has no points.
|
|
124
|
+
[[nodiscard]] bool empty() const;
|
|
125
|
+
|
|
126
|
+
/// Returns the most outter bounding box.
|
|
127
|
+
[[nodiscard]] const Box& boundingBox() const;
|
|
128
|
+
|
|
129
|
+
/// Returns the number of points.
|
|
130
|
+
[[nodiscard]] SizeType size() const;
|
|
131
|
+
|
|
132
|
+
/// Returns the depth of the tree.
|
|
133
|
+
[[nodiscard]] SizeType depth() const;
|
|
134
|
+
|
|
135
|
+
/// Checks that the KD tree is valid. This could be arbitrarily slow, so it should only be used
|
|
136
|
+
/// for debugging.
|
|
137
|
+
void validate() const;
|
|
138
|
+
|
|
139
|
+
protected:
|
|
140
|
+
/// Returns the SIMD packet size (e.g., 8 for AVX)
|
|
141
|
+
[[nodiscard]] virtual size_t getSimdPacketSize() const;
|
|
142
|
+
|
|
143
|
+
/// Internal implementation for validate()
|
|
144
|
+
virtual void validateInternal(SizeType node, const Box& box, std::vector<char>& touched) const;
|
|
145
|
+
|
|
146
|
+
/// Builds a tree; split the range [start, end) in two, generating a new Node at the split.
|
|
147
|
+
/// Returns the index of that new node.
|
|
148
|
+
SizeType split(
|
|
149
|
+
std::vector<std::pair<SizeType, Vec>>& points,
|
|
150
|
+
gsl::span<const Vec> normals,
|
|
151
|
+
gsl::span<const Col> colors,
|
|
152
|
+
SizeType start,
|
|
153
|
+
SizeType end,
|
|
154
|
+
SizeType depth);
|
|
155
|
+
|
|
156
|
+
/// Creates a leaf node when the number of points is equal to or greater than 8 SIMD blocks.
|
|
157
|
+
virtual SizeType createLeafNode(
|
|
158
|
+
std::vector<std::pair<SizeType, Vec>>& points,
|
|
159
|
+
gsl::span<const Vec> normals,
|
|
160
|
+
gsl::span<const Col> colors,
|
|
161
|
+
SizeType start,
|
|
162
|
+
SizeType end,
|
|
163
|
+
const Box& box);
|
|
164
|
+
|
|
165
|
+
/// Each node in the tree splits the space in half
|
|
166
|
+
struct Node {
|
|
167
|
+
/// Constructs as an internal node
|
|
168
|
+
Node(
|
|
169
|
+
Scalar splitVal_in,
|
|
170
|
+
unsigned char splitDim_in,
|
|
171
|
+
SizeType leftChild_in,
|
|
172
|
+
SizeType rightChild_in,
|
|
173
|
+
const Box& box_in);
|
|
174
|
+
|
|
175
|
+
/// Constructs as a leaf node
|
|
176
|
+
Node(SizeType leftChild_in, SizeType rightChild_in, const Box& box_in);
|
|
177
|
+
|
|
178
|
+
/// Returns whether this is a leaf node.
|
|
179
|
+
[[nodiscard]] bool isLeaf() const;
|
|
180
|
+
|
|
181
|
+
/// For internal nodes, the split value. For leaf nodes, std::numeric_limits<Scalar>::max().
|
|
182
|
+
const Scalar splitVal;
|
|
183
|
+
|
|
184
|
+
/// For internal nodes, the index to the left child node. For leaf nodes,
|
|
185
|
+
/// std::numeric_limits<unsigned char>::max().
|
|
186
|
+
const unsigned char splitDim;
|
|
187
|
+
|
|
188
|
+
union {
|
|
189
|
+
/// For internal nodes, the index to the left child node.
|
|
190
|
+
SizeType leftChild;
|
|
191
|
+
|
|
192
|
+
/// For leaf nodes, the block start of the list of points.
|
|
193
|
+
const SizeType pointBlocksStart;
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
union {
|
|
197
|
+
/// For internal nodes, the index to the right child node.
|
|
198
|
+
SizeType rightChild;
|
|
199
|
+
|
|
200
|
+
/// For leaf nodes, the block end of the list of points.
|
|
201
|
+
const SizeType pointBlocksEnd;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
/// Inner bounding box
|
|
205
|
+
const Box box;
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
/// The axis-aligned bounding box of the whole tree.
|
|
209
|
+
Box bbox_;
|
|
210
|
+
|
|
211
|
+
/// The number of points in the tree.
|
|
212
|
+
SizeType numPoints_;
|
|
213
|
+
|
|
214
|
+
/// The list of nodes in the tree.
|
|
215
|
+
std::vector<Node> nodes_;
|
|
216
|
+
|
|
217
|
+
/// The node index to the root node.
|
|
218
|
+
SizeType root_;
|
|
219
|
+
|
|
220
|
+
/// The largest depth of the tree.
|
|
221
|
+
SizeType depth_;
|
|
222
|
+
|
|
223
|
+
/// Used purely for debugging, to make sure we never use a normal-less k-d tree to check against
|
|
224
|
+
/// normals.
|
|
225
|
+
bool hasNormals_;
|
|
226
|
+
|
|
227
|
+
private:
|
|
228
|
+
/// Initializes the k-d tree. This function is intended to be only called by the constructor.
|
|
229
|
+
void init(
|
|
230
|
+
gsl::span<const Vec> points_in,
|
|
231
|
+
gsl::span<const Vec> normals_in,
|
|
232
|
+
gsl::span<const Col> colors_in);
|
|
233
|
+
|
|
234
|
+
/// PIMPL idiom to hide the SIMD specific implementation.
|
|
235
|
+
struct Implementation;
|
|
236
|
+
|
|
237
|
+
/// PIMPL instance for the SIMD implementation.
|
|
238
|
+
std::unique_ptr<Implementation> impl_;
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
using SimdKdTree2f = SimdKdTreef<2>;
|
|
242
|
+
using SimdKdTree3f = SimdKdTreef<3>;
|
|
243
|
+
|
|
244
|
+
AXEL_DEFINE_POINTERS(SimdKdTree2f);
|
|
245
|
+
AXEL_DEFINE_POINTERS(SimdKdTree3f);
|
|
246
|
+
|
|
247
|
+
extern template class SimdKdTreef<2>;
|
|
248
|
+
extern template class SimdKdTreef<3>;
|
|
249
|
+
|
|
250
|
+
#ifdef AXEL_ENABLE_AVX
|
|
251
|
+
|
|
252
|
+
template <int32_t nDim>
|
|
253
|
+
class SimdKdTreeAvxf : public SimdKdTreef<nDim> {
|
|
254
|
+
public:
|
|
255
|
+
using Base = SimdKdTreef<nDim>;
|
|
256
|
+
|
|
257
|
+
using Base::kColorDimensions;
|
|
258
|
+
using Base::kFarValueFloat;
|
|
259
|
+
|
|
260
|
+
using Box = typename Base::Box;
|
|
261
|
+
using Col = typename Base::Col;
|
|
262
|
+
using Scalar = typename Base::Scalar;
|
|
263
|
+
using SizeType = typename Base::SizeType;
|
|
264
|
+
using Vec = typename Base::Vec;
|
|
265
|
+
|
|
266
|
+
static constexpr SizeType kMaxDepth = Base::kMaxDepth;
|
|
267
|
+
|
|
268
|
+
/// Constructs k-d tree from points, normals, and colors
|
|
269
|
+
explicit SimdKdTreeAvxf(
|
|
270
|
+
gsl::span<const Vec> points = gsl::span<Vec>{},
|
|
271
|
+
gsl::span<const Vec> normals = gsl::span<Vec>{},
|
|
272
|
+
gsl::span<const Col> colors = gsl::span<Col>{});
|
|
273
|
+
|
|
274
|
+
/// Destructor
|
|
275
|
+
~SimdKdTreeAvxf() override;
|
|
276
|
+
|
|
277
|
+
/// Disables copy constructor.
|
|
278
|
+
SimdKdTreeAvxf(const SimdKdTreeAvxf&) = delete;
|
|
279
|
+
|
|
280
|
+
/// Disables assignment operator.
|
|
281
|
+
SimdKdTreeAvxf& operator=(const SimdKdTreeAvxf&) = delete;
|
|
282
|
+
|
|
283
|
+
// Documentation inherited
|
|
284
|
+
[[nodiscard]] std::tuple<bool, SizeType, Scalar> closestPoint(
|
|
285
|
+
const Vec& queryPoint,
|
|
286
|
+
Scalar maxSqrDist = std::numeric_limits<Scalar>::max()) const override;
|
|
287
|
+
|
|
288
|
+
// Documentation inherited
|
|
289
|
+
[[nodiscard]] std::tuple<bool, SizeType, Scalar> closestPoint(
|
|
290
|
+
const Vec& queryPoint,
|
|
291
|
+
const Vec& normal,
|
|
292
|
+
Scalar maxSqrDist = std::numeric_limits<Scalar>::max(),
|
|
293
|
+
Scalar maxNormalDot = 0.0f) const override;
|
|
294
|
+
|
|
295
|
+
// Documentation inherited
|
|
296
|
+
[[nodiscard]] std::tuple<bool, SizeType, Scalar> closestPoint(
|
|
297
|
+
const Vec& queryPoint,
|
|
298
|
+
const Vec& normal,
|
|
299
|
+
const Col& color,
|
|
300
|
+
Scalar maxSqrDist = std::numeric_limits<Scalar>::max(),
|
|
301
|
+
Scalar maxNormalDot = 0.0f,
|
|
302
|
+
Scalar maxColorSqrDist = 0.5f) const override;
|
|
303
|
+
|
|
304
|
+
/// Allows the user to mark out which points are considered 'acceptable.'
|
|
305
|
+
///
|
|
306
|
+
/// The passed-in function should map from a __m256i (the indices) to an __m256i which uses the
|
|
307
|
+
/// standard AVX convention (all ones in the appropriate spots). It also needs to be tolerant to
|
|
308
|
+
/// possible INT_MAX values since we may not have actual indices for all 4 points.
|
|
309
|
+
///
|
|
310
|
+
/// Here's an example acceptance function that looks for odd-valued points:
|
|
311
|
+
///
|
|
312
|
+
/// @code
|
|
313
|
+
/// [] (const __m256i indices_in) -> __m256i
|
|
314
|
+
/// {
|
|
315
|
+
/// const int all_zeros = 0;
|
|
316
|
+
/// const int all_ones = ~all_zeros;
|
|
317
|
+
///
|
|
318
|
+
/// alignas(AVX_ALIGNMENT) int32_t indices[8];
|
|
319
|
+
/// _mm256_store_si256 ((__m256i*) indices, indices_in);
|
|
320
|
+
///
|
|
321
|
+
/// alignas(AVX_ALIGNMENT) int32_t result[8];
|
|
322
|
+
/// for (int32_t j = 0; j < 8; ++j)
|
|
323
|
+
/// {
|
|
324
|
+
/// if (indices[j] % 2 == 0)
|
|
325
|
+
/// result[j] = all_ones;
|
|
326
|
+
/// else
|
|
327
|
+
/// result[j] = all_zeros;
|
|
328
|
+
/// }
|
|
329
|
+
///
|
|
330
|
+
/// return _mm256_load_si256 ((const __m256i*) result);
|
|
331
|
+
/// } );
|
|
332
|
+
/// @endcode
|
|
333
|
+
template <typename AcceptanceFunction>
|
|
334
|
+
[[nodiscard]] std::tuple<bool, SizeType, Scalar> closestPointWithAcceptance(
|
|
335
|
+
const Vec& queryPoint,
|
|
336
|
+
Scalar maxSqrDist,
|
|
337
|
+
const AcceptanceFunction& acceptanceFunction) const;
|
|
338
|
+
|
|
339
|
+
// Documentation inherited
|
|
340
|
+
void pointsInNSphere(const Vec& center, Scalar radius, std::vector<SizeType>& points)
|
|
341
|
+
const override;
|
|
342
|
+
|
|
343
|
+
protected:
|
|
344
|
+
// Documentation inherited
|
|
345
|
+
[[nodiscard]] size_t getSimdPacketSize() const override;
|
|
346
|
+
|
|
347
|
+
// Documentation inherited
|
|
348
|
+
void validateInternal(SizeType node, const Box& box, std::vector<char>& touched) const override;
|
|
349
|
+
|
|
350
|
+
// Documentation inherited
|
|
351
|
+
SizeType createLeafNode(
|
|
352
|
+
std::vector<std::pair<SizeType, Vec>>& points,
|
|
353
|
+
gsl::span<const Vec> normals,
|
|
354
|
+
gsl::span<const Col> colors,
|
|
355
|
+
SizeType start,
|
|
356
|
+
SizeType end,
|
|
357
|
+
const Box& box) override;
|
|
358
|
+
|
|
359
|
+
private:
|
|
360
|
+
using Node = typename Base::Node;
|
|
361
|
+
|
|
362
|
+
static constexpr int32_t AVX_FLOAT_BLOCK_SIZE = 8;
|
|
363
|
+
static constexpr int32_t AVX_ALIGNMENT = AVX_FLOAT_BLOCK_SIZE * 4;
|
|
364
|
+
|
|
365
|
+
/// In order to enable the use of AVX intrinsics, we will store the points in blocks of 8. Empty
|
|
366
|
+
/// point values will get FAR_VALUE for their location (so we can safely use it in difference and
|
|
367
|
+
/// squared norm operations) and INT_MAX for their index.
|
|
368
|
+
struct PointBlock {
|
|
369
|
+
__m256 values[nDim]; // [ {x1 x2 x3 x4 x5 x6 x7 x8}, {y1 y2 y3 y4 y5 y6 y7 y8}, ... ]
|
|
370
|
+
__m256i indices; // [i1 i2 i3 i4 i5 i6 i7 i8]
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
struct NormalBlock {
|
|
374
|
+
__m256 values[nDim];
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
struct ColorBlock {
|
|
378
|
+
__m256 values[4];
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
/// Initializes the k-d tree. This function is intended to be only called by the constructor.
|
|
382
|
+
void init(
|
|
383
|
+
gsl::span<const Vec> points_in,
|
|
384
|
+
gsl::span<const Vec> normals_in,
|
|
385
|
+
gsl::span<const Col> colors_in);
|
|
386
|
+
|
|
387
|
+
std::vector<PointBlock> pointBlocks_;
|
|
388
|
+
std::vector<NormalBlock> normalBlocks_;
|
|
389
|
+
std::vector<ColorBlock> colorBlocks_;
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
template <int32_t nDim>
|
|
393
|
+
template <typename AcceptanceFunction>
|
|
394
|
+
std::tuple<bool, typename SimdKdTreeAvxf<nDim>::SizeType, typename SimdKdTreeAvxf<nDim>::Scalar>
|
|
395
|
+
SimdKdTreeAvxf<nDim>::closestPointWithAcceptance(
|
|
396
|
+
const Vec& queryPoint,
|
|
397
|
+
Scalar maxSqrDist,
|
|
398
|
+
const AcceptanceFunction& acceptanceFunction) const {
|
|
399
|
+
Scalar bestSqrDist = maxSqrDist;
|
|
400
|
+
SizeType bestPoint = std::numeric_limits<SizeType>::max();
|
|
401
|
+
bool foundPoint = false;
|
|
402
|
+
|
|
403
|
+
if (this->empty()) {
|
|
404
|
+
return std::make_tuple(foundPoint, bestPoint, bestSqrDist);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Use an explicit stack for speed:
|
|
408
|
+
std::array<SizeType, kMaxDepth + 1> nodeStack;
|
|
409
|
+
|
|
410
|
+
// Start with just the root on the stack:
|
|
411
|
+
SizeType stackSize = 1;
|
|
412
|
+
nodeStack[0] = this->root_;
|
|
413
|
+
|
|
414
|
+
__m256 query_p[nDim];
|
|
415
|
+
for (SizeType iDim = 0; iDim < nDim; ++iDim) {
|
|
416
|
+
query_p[iDim] = _mm256_broadcast_ss(&queryPoint(iDim));
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
while (stackSize != 0) {
|
|
420
|
+
// Pop the top of the stack:
|
|
421
|
+
const SizeType cur = nodeStack[--stackSize];
|
|
422
|
+
const auto& curNode = this->nodes_[cur];
|
|
423
|
+
|
|
424
|
+
// check again if the current best distance is smaller than the distance to the current node
|
|
425
|
+
// split. if so we can skip the node
|
|
426
|
+
if (curNode.box.squaredExteriorDistance(queryPoint) > bestSqrDist) {
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
if (curNode.isLeaf()) {
|
|
431
|
+
const SizeType pointBlocksStart = curNode.pointBlocksStart;
|
|
432
|
+
const SizeType pointBlocksEnd = curNode.pointBlocksEnd;
|
|
433
|
+
XR_CHECK(pointBlocksEnd > pointBlocksStart);
|
|
434
|
+
|
|
435
|
+
__m256 bestSqrDistBlock = _mm256_broadcast_ss(&bestSqrDist);
|
|
436
|
+
__m256i bestSqrDistIndicesBlock = _mm256_set1_epi32(INT_MAX);
|
|
437
|
+
|
|
438
|
+
for (SizeType iBlock = pointBlocksStart; iBlock != pointBlocksEnd; ++iBlock) {
|
|
439
|
+
const PointBlock& pointBlock = pointBlocks_[iBlock];
|
|
440
|
+
__m256 sqrDist = _mm256_setzero_ps();
|
|
441
|
+
for (SizeType iDim = 0; iDim < nDim; ++iDim) {
|
|
442
|
+
const __m256 dimDiff = _mm256_sub_ps(pointBlock.values[iDim], query_p[iDim]);
|
|
443
|
+
sqrDist = _mm256_add_ps(sqrDist, _mm256_mul_ps(dimDiff, dimDiff));
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const __m256 lessThanMask = _mm256_cmp_ps(sqrDist, bestSqrDistBlock, _CMP_LT_OS);
|
|
447
|
+
const __m256 userMask = _mm256_castsi256_ps(acceptanceFunction(pointBlock.indices));
|
|
448
|
+
const __m256 finalMask = _mm256_and_ps(lessThanMask, userMask);
|
|
449
|
+
bestSqrDistBlock = _mm256_or_ps(
|
|
450
|
+
_mm256_and_ps(finalMask, sqrDist), _mm256_andnot_ps(finalMask, bestSqrDistBlock));
|
|
451
|
+
|
|
452
|
+
const __m256i finalMaskInt = _mm256_castps_si256(finalMask);
|
|
453
|
+
bestSqrDistIndicesBlock = _mm256_or_si256(
|
|
454
|
+
_mm256_and_si256(finalMaskInt, pointBlock.indices),
|
|
455
|
+
_mm256_andnot_si256(finalMaskInt, bestSqrDistIndicesBlock));
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
alignas(AVX_ALIGNMENT) float bestSqrDist_extract[AVX_FLOAT_BLOCK_SIZE];
|
|
459
|
+
_mm256_store_ps(bestSqrDist_extract, bestSqrDistBlock);
|
|
460
|
+
|
|
461
|
+
alignas(AVX_ALIGNMENT) SizeType bestSqrDistIndices_extract[AVX_FLOAT_BLOCK_SIZE];
|
|
462
|
+
_mm256_store_si256((__m256i*)bestSqrDistIndices_extract, bestSqrDistIndicesBlock);
|
|
463
|
+
|
|
464
|
+
for (SizeType k = 0; k < AVX_FLOAT_BLOCK_SIZE; ++k) {
|
|
465
|
+
if (bestSqrDist_extract[k] < bestSqrDist) {
|
|
466
|
+
XR_CHECK(bestSqrDistIndices_extract[k] != INT_MAX);
|
|
467
|
+
XR_CHECK(bestSqrDistIndices_extract[k] < this->numPoints_);
|
|
468
|
+
foundPoint = true;
|
|
469
|
+
bestPoint = bestSqrDistIndices_extract[k];
|
|
470
|
+
bestSqrDist = bestSqrDist_extract[k];
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
} else {
|
|
474
|
+
// We need to descend on
|
|
475
|
+
const unsigned char splitDim = curNode.splitDim;
|
|
476
|
+
const Scalar splitVal = curNode.splitVal;
|
|
477
|
+
const Scalar queryPointVal = queryPoint[splitDim];
|
|
478
|
+
const Scalar distToSplit = (queryPointVal - splitVal);
|
|
479
|
+
const Scalar sqrDistToSplit = distToSplit * distToSplit;
|
|
480
|
+
|
|
481
|
+
if (queryPointVal >= splitVal) {
|
|
482
|
+
// We only need to descend if the distance to the split is less than the distance to our
|
|
483
|
+
// best point so far.
|
|
484
|
+
if (sqrDistToSplit < bestSqrDist) {
|
|
485
|
+
nodeStack[stackSize++] = curNode.leftChild;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// Since the query point is in the right half of the space we think it more likely that
|
|
489
|
+
// we'll find the closest point in that half of the space, so we should descend on it first.
|
|
490
|
+
// Since we grab the top entry of the stack first, this implies pushing it last.
|
|
491
|
+
nodeStack[stackSize++] = curNode.rightChild;
|
|
492
|
+
} else {
|
|
493
|
+
// Same as above:
|
|
494
|
+
if (sqrDistToSplit < bestSqrDist) {
|
|
495
|
+
nodeStack[stackSize++] = curNode.rightChild;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
nodeStack[stackSize++] = curNode.leftChild;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
XR_CHECK(!foundPoint || bestPoint < this->numPoints_);
|
|
504
|
+
return std::make_tuple(foundPoint, bestPoint, bestSqrDist);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
using SimdKdTreeAvx3f = SimdKdTreeAvxf<3>;
|
|
508
|
+
using SimdKdTreeAvx2f = SimdKdTreeAvxf<2>;
|
|
509
|
+
|
|
510
|
+
extern template class SimdKdTreeAvxf<3>;
|
|
511
|
+
extern template class SimdKdTreeAvxf<2>;
|
|
512
|
+
|
|
513
|
+
#endif
|
|
514
|
+
|
|
515
|
+
} // namespace axel
|
include/axel/TriBvh.h
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* 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
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <optional>
|
|
11
|
+
|
|
12
|
+
#ifndef AXEL_NO_DISPENSO
|
|
13
|
+
#include <dispenso/parallel_for.h>
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
#include "axel/Bvh.h"
|
|
17
|
+
#include "axel/Ray.h"
|
|
18
|
+
|
|
19
|
+
namespace axel {
|
|
20
|
+
|
|
21
|
+
inline constexpr double kDefaultBoundingBoxThickness{0.0};
|
|
22
|
+
|
|
23
|
+
template <typename S, size_t LeafCapacity = 1>
|
|
24
|
+
class TriBvh {
|
|
25
|
+
public:
|
|
26
|
+
using Scalar = S;
|
|
27
|
+
using QueryBuffer = typename BvhBase<S>::QueryBuffer;
|
|
28
|
+
using ClosestSurfacePointResult = ::axel::ClosestSurfacePointResult<S>;
|
|
29
|
+
|
|
30
|
+
TriBvh() = default;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @brief Construct a new Bvh from the given positions and triangles. The constructor assumes
|
|
34
|
+
* that the integrity of provided positions and triangles is checked beforehand.
|
|
35
|
+
*/
|
|
36
|
+
explicit TriBvh(
|
|
37
|
+
Eigen::MatrixX3<S>&& positions,
|
|
38
|
+
Eigen::MatrixX3i&& triangles,
|
|
39
|
+
const std::optional<S>& boundingBoxThickness = kDefaultBoundingBoxThickness);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @brief Performs a query with a given bounding box.
|
|
43
|
+
* All primitives whose bounding box intersects with the query get returned as a list of their
|
|
44
|
+
* IDs, e.g. the triangle indices.
|
|
45
|
+
*/
|
|
46
|
+
std::vector<uint32_t> boxQuery(const BoundingBox<S>& box) const;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @brief Performs a query with a given bounding box.
|
|
50
|
+
* Stores up to 512 primitive IDs in the query buffer, such that their bounding boxes
|
|
51
|
+
* intersect with the query.
|
|
52
|
+
* The number of valid hits in the buffer is returned.
|
|
53
|
+
* NOTE: This method performs no dynamic memory allocation.
|
|
54
|
+
*/
|
|
55
|
+
uint32_t boxQuery(const BoundingBox<S>& box, QueryBuffer& hits) const;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @brief Returns all primitives hit by the line formed from the ray's direction.
|
|
59
|
+
*/
|
|
60
|
+
std::vector<uint32_t> lineHits(const Ray3<S>& ray) const;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @brief Returns the closest hit with the given query ray.
|
|
64
|
+
* If the ray hits nothing, returns a std::nullopt.
|
|
65
|
+
*/
|
|
66
|
+
std::optional<IntersectionResult<S>> closestHit(const Ray3<S>& ray) const;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @brief Returns all hits with the given query ray.
|
|
70
|
+
*/
|
|
71
|
+
std::vector<IntersectionResult<S>> allHits(const Ray3<S>& ray) const;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @brief Checks whether the given ray intersects any of the primitives in the Bvh.
|
|
75
|
+
*/
|
|
76
|
+
bool anyHit(const Ray3<S>& ray) const;
|
|
77
|
+
|
|
78
|
+
ClosestSurfacePointResult closestSurfacePoint(const Eigen::Vector3<S>& query) const;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @brief Returns the total number of internal nodes in the tree.
|
|
82
|
+
*/
|
|
83
|
+
size_t getNodeCount() const;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @brief Returns the total number of primitives in the tree. It should be equal to the number of
|
|
87
|
+
* triangles that Bvh was constructed with.
|
|
88
|
+
*/
|
|
89
|
+
size_t getPrimitiveCount() const;
|
|
90
|
+
|
|
91
|
+
private:
|
|
92
|
+
// This memory layout is required for gather operations in vectorized code.
|
|
93
|
+
Eigen::Matrix<S, Eigen::Dynamic, 3, Eigen::RowMajor> positions_;
|
|
94
|
+
Eigen::MatrixX3i triangles_;
|
|
95
|
+
Bvh<S, LeafCapacity> bvh_;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
using TriBvhf = TriBvh<float>;
|
|
99
|
+
using TriBvhd = TriBvh<double>;
|
|
100
|
+
|
|
101
|
+
extern template class TriBvh<float>;
|
|
102
|
+
extern template class TriBvh<double>;
|
|
103
|
+
extern template class TriBvh<float, kNativeLaneWidth<float>>;
|
|
104
|
+
extern template class TriBvh<double, kNativeLaneWidth<double>>;
|
|
105
|
+
|
|
106
|
+
template <typename Derived, typename F>
|
|
107
|
+
void closestSurfacePoints(
|
|
108
|
+
const TriBvh<typename Derived::Scalar>& bvh,
|
|
109
|
+
const Eigen::PlainObjectBase<Derived>& queryPoints,
|
|
110
|
+
F&& resultFunc) {
|
|
111
|
+
#ifdef AXEL_NO_DISPENSO
|
|
112
|
+
for (uint32_t i = 0; i < queryPoints.rows(); ++i) {
|
|
113
|
+
resultFunc(i, bvh.closestSurfacePoint(queryPoints.row(i)));
|
|
114
|
+
}
|
|
115
|
+
#else
|
|
116
|
+
dispenso::parallel_for(
|
|
117
|
+
0, queryPoints.rows(), [&bvh, &queryPoints, &resultFunc](const uint32_t i) {
|
|
118
|
+
resultFunc(i, bvh.closestSurfacePoint(queryPoints.row(i)));
|
|
119
|
+
});
|
|
120
|
+
#endif
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
template <typename Derived1, typename Derived2, typename Derived3, typename Derived4>
|
|
124
|
+
void closestSurfacePoints(
|
|
125
|
+
const TriBvh<typename Derived1::Scalar>& bvh,
|
|
126
|
+
const Eigen::PlainObjectBase<Derived1>& queryPoints,
|
|
127
|
+
Eigen::PlainObjectBase<Derived2>& closestSquareDistances,
|
|
128
|
+
Eigen::PlainObjectBase<Derived3>& closestTriangles,
|
|
129
|
+
Eigen::PlainObjectBase<Derived4>& closestPoints) {
|
|
130
|
+
using S = typename Derived1::Scalar;
|
|
131
|
+
static_assert(
|
|
132
|
+
std::is_same_v<typename Derived2::Scalar, S> && std::is_same_v<typename Derived4::Scalar, S>,
|
|
133
|
+
"All output matrices must have the same scalar type.");
|
|
134
|
+
closestSquareDistances.resize(queryPoints.rows(), 1);
|
|
135
|
+
closestTriangles.resize(queryPoints.rows(), 1);
|
|
136
|
+
closestPoints.resize(queryPoints.rows(), 3);
|
|
137
|
+
|
|
138
|
+
const auto closestSquareDistancesLambda =
|
|
139
|
+
[&bvh, &queryPoints, &closestSquareDistances, &closestPoints, &closestTriangles](
|
|
140
|
+
const uint32_t i) {
|
|
141
|
+
const auto result = bvh.closestSurfacePoint(queryPoints.row(i));
|
|
142
|
+
closestPoints.row(i) = result.point;
|
|
143
|
+
closestTriangles(i) = static_cast<int32_t>(result.triangleIdx);
|
|
144
|
+
closestSquareDistances(i) =
|
|
145
|
+
(Eigen::Vector3<S>(queryPoints.row(i)) - result.point).squaredNorm();
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
#ifdef AXEL_NO_DISPENSO
|
|
149
|
+
for (uint32_t i = 0; i < queryPoints.rows(); ++i) {
|
|
150
|
+
closestSquareDistancesLambda(i);
|
|
151
|
+
}
|
|
152
|
+
#else
|
|
153
|
+
dispenso::parallel_for(0, queryPoints.rows(), closestSquareDistancesLambda);
|
|
154
|
+
#endif
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
} // namespace axel
|