pymomentum-cpu 0.1.78.post11__cp312-cp312-win_amd64.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/arrow_bundled_dependencies.lib +0 -0
- lib/arrow_static.lib +0 -0
- lib/axel.lib +0 -0
- lib/cmake/axel/axel-config.cmake +45 -0
- lib/cmake/axel/axelTargets-release.cmake +19 -0
- lib/cmake/axel/axelTargets.cmake +108 -0
- lib/cmake/momentum/Findre2.cmake +52 -0
- lib/cmake/momentum/momentum-config.cmake +67 -0
- lib/cmake/momentum/momentumTargets-release.cmake +259 -0
- lib/cmake/momentum/momentumTargets.cmake +377 -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/momentum_app_utils.lib +0 -0
- lib/momentum_character.lib +0 -0
- lib/momentum_character_sequence_solver.lib +0 -0
- lib/momentum_character_solver.lib +0 -0
- lib/momentum_common.lib +0 -0
- lib/momentum_diff_ik.lib +0 -0
- lib/momentum_io.lib +0 -0
- lib/momentum_io_common.lib +0 -0
- lib/momentum_io_fbx.lib +0 -0
- lib/momentum_io_gltf.lib +0 -0
- lib/momentum_io_legacy_json.lib +0 -0
- lib/momentum_io_marker.lib +0 -0
- lib/momentum_io_motion.lib +0 -0
- lib/momentum_io_shape.lib +0 -0
- lib/momentum_io_skeleton.lib +0 -0
- lib/momentum_io_urdf.lib +0 -0
- lib/momentum_marker_tracker.lib +0 -0
- lib/momentum_math.lib +0 -0
- lib/momentum_online_qr.lib +0 -0
- lib/momentum_process_markers.lib +0 -0
- lib/momentum_rerun.lib +0 -0
- lib/momentum_simd_constraints.lib +0 -0
- lib/momentum_simd_generalized_loss.lib +0 -0
- lib/momentum_skeleton.lib +0 -0
- lib/momentum_solver.lib +0 -0
- lib/rerun_c__win_x64.lib +0 -0
- lib/rerun_sdk.lib +0 -0
- pymomentum/axel.cp312-win_amd64.pyd +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.cp312-win_amd64.pyd +0 -0
- pymomentum/marker_tracking.cp312-win_amd64.pyd +0 -0
- pymomentum/quaternion.py +740 -0
- pymomentum/skel_state.py +514 -0
- pymomentum/solver.cp312-win_amd64.pyd +0 -0
- pymomentum/solver2.cp312-win_amd64.pyd +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.78.post11.dist-info/METADATA +121 -0
- pymomentum_cpu-0.1.78.post11.dist-info/RECORD +512 -0
- pymomentum_cpu-0.1.78.post11.dist-info/WHEEL +5 -0
- pymomentum_cpu-0.1.78.post11.dist-info/licenses/LICENSE +21 -0
include/axel/Bvh.h
ADDED
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Portions Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/* which bore the following notice:
|
|
9
|
+
Copyright (c) 2012 Brandon Pelfrey
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
|
11
|
+
associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
12
|
+
including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
|
13
|
+
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
|
14
|
+
furnished to do so, subject to the following conditions: The above copyright notice and this
|
|
15
|
+
permission notice shall be included in all copies or substantial portions of the Software. THE
|
|
16
|
+
SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
|
17
|
+
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
18
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
#pragma once
|
|
24
|
+
|
|
25
|
+
#include <vector>
|
|
26
|
+
|
|
27
|
+
#include "axel/BvhBase.h"
|
|
28
|
+
#include "axel/BvhCommon.h"
|
|
29
|
+
#include "axel/common/Types.h"
|
|
30
|
+
#include "axel/common/VectorizationTypes.h"
|
|
31
|
+
|
|
32
|
+
// BVH based on https://github.com/brandonpelfrey/Fast-BVH
|
|
33
|
+
|
|
34
|
+
namespace axel {
|
|
35
|
+
|
|
36
|
+
template <typename S>
|
|
37
|
+
struct BvhFlatNode {
|
|
38
|
+
BoundingBox<S> bbox;
|
|
39
|
+
uint32_t start{}, nPrims{}, rightOffset{};
|
|
40
|
+
|
|
41
|
+
[[nodiscard]] bool isLeaf() const {
|
|
42
|
+
return rightOffset == 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
[[nodiscard]] uint32_t getLeftIndex(uint32_t index) const {
|
|
46
|
+
return index + 1;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
[[nodiscard]] uint32_t getRightIndex(uint32_t index) const {
|
|
50
|
+
return index + rightOffset;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Invokes a callback function for each primitive within the node. If the callback function
|
|
54
|
+
// returns a boolean, a return value of true indicates that the iteration should stop, while
|
|
55
|
+
// false allows it to continue.
|
|
56
|
+
template <typename Callback>
|
|
57
|
+
auto eachPrimitive(std::vector<BoundingBox<S>>& primitives, Callback&& callback);
|
|
58
|
+
|
|
59
|
+
// Invokes a callback function for each primitive within the node. If the callback function
|
|
60
|
+
// returns a boolean, a return value of true indicates that the iteration should stop, while
|
|
61
|
+
// false allows it to continue.
|
|
62
|
+
template <typename Callback>
|
|
63
|
+
auto eachPrimitive(const std::vector<BoundingBox<S>>& primitives, Callback&& callback) const;
|
|
64
|
+
|
|
65
|
+
// Invokes a callback function for each primitive within the node starting from a specified
|
|
66
|
+
// index. If the callback function returns a boolean, a return value of true indicates that the
|
|
67
|
+
// iteration should stop, while false allows it to continue.
|
|
68
|
+
template <typename Callback>
|
|
69
|
+
auto
|
|
70
|
+
eachPrimitive(std::vector<BoundingBox<S>>& primitives, uint32_t startIndex, Callback&& callback);
|
|
71
|
+
|
|
72
|
+
// Invokes a callback function for each primitive within the node starting from a specified
|
|
73
|
+
// index. If the callback function returns a boolean, a return value of true indicates that the
|
|
74
|
+
// iteration should stop, while false allows it to continue.
|
|
75
|
+
template <typename Callback>
|
|
76
|
+
auto eachPrimitive(
|
|
77
|
+
const std::vector<BoundingBox<S>>& primitives,
|
|
78
|
+
uint32_t startIndex,
|
|
79
|
+
Callback&& callback) const;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
template <typename S, size_t LeafCapacity = 1>
|
|
83
|
+
class Bvh final : public BvhBase<S> {
|
|
84
|
+
public:
|
|
85
|
+
using BvhType = Bvh<S, LeafCapacity>;
|
|
86
|
+
using Scalar = S;
|
|
87
|
+
using QueryBuffer = typename BvhBase<S>::QueryBuffer;
|
|
88
|
+
static constexpr size_t kLeafCapacity = LeafCapacity;
|
|
89
|
+
static constexpr size_t kMaxStackDepth = 64;
|
|
90
|
+
|
|
91
|
+
Bvh() = default;
|
|
92
|
+
explicit Bvh(const std::vector<BoundingBox<S>>& buildPrimitives);
|
|
93
|
+
~Bvh() override = default;
|
|
94
|
+
|
|
95
|
+
Bvh(const Bvh&) = default;
|
|
96
|
+
Bvh& operator=(const Bvh&) = default;
|
|
97
|
+
|
|
98
|
+
Bvh(Bvh&&) = default;
|
|
99
|
+
Bvh& operator=(Bvh&&) = default;
|
|
100
|
+
|
|
101
|
+
// Sets the bounding boxes of the leaf nodes of the BVH. This function calls build() internally,
|
|
102
|
+
// so there's no need to call build() again after setting the bounding boxes.
|
|
103
|
+
void setBoundingBoxes(const std::vector<BoundingBox<S>>& bboxes) override;
|
|
104
|
+
|
|
105
|
+
// Rebuilds the BVH based on the bounding boxes previously set via setBoundingBoxes(). This
|
|
106
|
+
// function is useful when the bounding boxes, accessed via getPrimitives(), are updated and a
|
|
107
|
+
// rebuild of the tree is needed.
|
|
108
|
+
void build();
|
|
109
|
+
|
|
110
|
+
[[nodiscard]] std::vector<BoundingBox<S>>& getPrimitives();
|
|
111
|
+
|
|
112
|
+
[[nodiscard]] const std::vector<BoundingBox<S>>& getPrimitives() const;
|
|
113
|
+
|
|
114
|
+
// Refits the tree to account for changes in the bounding boxes of leaf nodes. This is achieved
|
|
115
|
+
// by updating the entire tree in a bottom-up manner to ensure accurate collision detection.
|
|
116
|
+
void refit();
|
|
117
|
+
|
|
118
|
+
// Queries the BVH for bounding boxes intersecting with the specified box.
|
|
119
|
+
[[nodiscard]] std::vector<uint32_t> query(const BoundingBox<S>& box) const override;
|
|
120
|
+
|
|
121
|
+
// Overloaded query function that stores intersecting bounding boxes in a provided buffer,
|
|
122
|
+
// returning the count.
|
|
123
|
+
uint32_t query(const BoundingBox<S>& box, QueryBuffer& hits) const override;
|
|
124
|
+
|
|
125
|
+
// Queries the BVH for bounding boxes intersected by a ray specified by its origin and direction.
|
|
126
|
+
[[nodiscard]] std::vector<uint32_t> query(
|
|
127
|
+
const Eigen::Vector3<S>& origin,
|
|
128
|
+
const Eigen::Vector3<S>& direction) const override;
|
|
129
|
+
|
|
130
|
+
// Queries the BVH for the closest point on the surface to a specified query point.
|
|
131
|
+
template <typename ClosestSurfacePointFunc>
|
|
132
|
+
[[nodiscard]] ClosestSurfacePointResult<S> queryClosestSurfacePoint(
|
|
133
|
+
const Eigen::Vector3<S>& query,
|
|
134
|
+
ClosestSurfacePointFunc&& func) const;
|
|
135
|
+
template <typename ClosestSurfacePointFunc>
|
|
136
|
+
[[nodiscard]] ClosestSurfacePointResult<S> queryClosestSurfacePointPacket(
|
|
137
|
+
const Eigen::Vector3<S>& query,
|
|
138
|
+
ClosestSurfacePointFunc&& func) const;
|
|
139
|
+
|
|
140
|
+
// Queries the BVH for the closest hit along a ray within a specified range of t-values.
|
|
141
|
+
template <typename ReturnType, typename RayPrimitiveIntersector>
|
|
142
|
+
[[nodiscard]] ReturnType rayQueryClosestHit(
|
|
143
|
+
const Eigen::Vector3<S>& origin,
|
|
144
|
+
const Eigen::Vector3<S>& direction,
|
|
145
|
+
S minT,
|
|
146
|
+
S maxT,
|
|
147
|
+
RayPrimitiveIntersector&& func) const;
|
|
148
|
+
|
|
149
|
+
// Queries the BVH for any hit along a ray within a specified range of t-values, returning true if
|
|
150
|
+
// such an intersection exists, or false otherwise.
|
|
151
|
+
template <typename RayPrimitiveIntersector>
|
|
152
|
+
[[nodiscard]] bool rayQueryAnyHit(
|
|
153
|
+
const Eigen::Vector3<S>& origin,
|
|
154
|
+
const Eigen::Vector3<S>& direction,
|
|
155
|
+
S minT,
|
|
156
|
+
S maxT,
|
|
157
|
+
RayPrimitiveIntersector&& func) const;
|
|
158
|
+
|
|
159
|
+
// Invokes the provided callback function for each pair of overlapping bounding boxes within this
|
|
160
|
+
// BVH. The callback function should return false if the traversal should stop, or false
|
|
161
|
+
// otherwise.
|
|
162
|
+
template <typename Callback>
|
|
163
|
+
void traverseOverlappingPairs(Callback&& func) const;
|
|
164
|
+
|
|
165
|
+
// Invokes the provided callback function for each pair of overlapping bounding boxes between this
|
|
166
|
+
// BVH and another BVH. Note that the indices passed to the callback are relative to each BVH's
|
|
167
|
+
// own primitive list. The callback function should return false if the traversal should stop,
|
|
168
|
+
// or false otherwise.
|
|
169
|
+
template <typename Callback>
|
|
170
|
+
void traverseOverlappingPairs(const BvhType& other, Callback&& func) const;
|
|
171
|
+
|
|
172
|
+
// Returns the total number of nodes in the BVH.
|
|
173
|
+
[[nodiscard]] Size getNodeCount() const;
|
|
174
|
+
|
|
175
|
+
// Returns the total number of primitives (bounding boxes) in the BVH.
|
|
176
|
+
[[nodiscard]] Size getPrimitiveCount() const override;
|
|
177
|
+
|
|
178
|
+
// Checks if all bounding boxes in the BVH tree are correctly structured.
|
|
179
|
+
// This method is mainly used for debugging purposes.
|
|
180
|
+
[[nodiscard]] bool checkBoundingBoxes() const;
|
|
181
|
+
|
|
182
|
+
private:
|
|
183
|
+
// This bool is used to select either a scalar or a packet-based callback type.
|
|
184
|
+
template <bool IsPacket, bool NeedBarycentric, typename ClosestSurfacePointFunc>
|
|
185
|
+
S queryClosestHelper(
|
|
186
|
+
uint32_t nodeIdx,
|
|
187
|
+
const Eigen::Vector3<S>& query,
|
|
188
|
+
const ClosestSurfacePointFunc& func,
|
|
189
|
+
S sqrDist,
|
|
190
|
+
ClosestSurfacePointResult<S>& result) const;
|
|
191
|
+
|
|
192
|
+
std::vector<BvhFlatNode<S>> flatTree_;
|
|
193
|
+
std::vector<BoundingBox<S>> buildPrimitives_;
|
|
194
|
+
|
|
195
|
+
Size nodeCount_{0};
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
using Bvhf = Bvh<float, 1>;
|
|
199
|
+
using Bvhd = Bvh<double, 1>;
|
|
200
|
+
|
|
201
|
+
extern template class Bvh<float, 1>;
|
|
202
|
+
extern template class Bvh<double, 1>;
|
|
203
|
+
extern template class Bvh<float, kNativeLaneWidth<float>>;
|
|
204
|
+
extern template class Bvh<double, kNativeLaneWidth<double>>;
|
|
205
|
+
|
|
206
|
+
} // namespace axel
|
|
207
|
+
|
|
208
|
+
#include <axel/Checks.h>
|
|
209
|
+
|
|
210
|
+
//------------------------------------------------------------------------------
|
|
211
|
+
// Implementation
|
|
212
|
+
//------------------------------------------------------------------------------
|
|
213
|
+
|
|
214
|
+
namespace axel {
|
|
215
|
+
|
|
216
|
+
template <typename S>
|
|
217
|
+
template <typename Callback>
|
|
218
|
+
auto BvhFlatNode<S>::eachPrimitive(std::vector<BoundingBox<S>>& primitives, Callback&& callback) {
|
|
219
|
+
static_assert(
|
|
220
|
+
std::is_invocable_v<Callback, BoundingBox<S>&>,
|
|
221
|
+
"Callback function must be invocable with a BoundingBox<S>& argument");
|
|
222
|
+
|
|
223
|
+
if constexpr (std::is_same_v<bool, std::invoke_result_t<Callback, BoundingBox<S>&>>) {
|
|
224
|
+
for (uint32_t i = start; i < start + nPrims; ++i) {
|
|
225
|
+
if (!callback(primitives[i])) {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return true;
|
|
230
|
+
} else {
|
|
231
|
+
for (uint32_t i = start; i < start + nPrims; ++i) {
|
|
232
|
+
callback(primitives[i]);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
template <typename S>
|
|
238
|
+
template <typename Callback>
|
|
239
|
+
auto BvhFlatNode<S>::eachPrimitive(
|
|
240
|
+
const std::vector<BoundingBox<S>>& primitives,
|
|
241
|
+
Callback&& callback) const {
|
|
242
|
+
static_assert(
|
|
243
|
+
std::is_invocable_v<Callback, const BoundingBox<S>&>,
|
|
244
|
+
"Callback function must be invocable with a const BoundingBox<S>& argument");
|
|
245
|
+
|
|
246
|
+
if constexpr (std::is_same_v<bool, std::invoke_result_t<Callback, const BoundingBox<S>&>>) {
|
|
247
|
+
for (uint32_t i = start; i < start + nPrims; ++i) {
|
|
248
|
+
if (!callback(primitives[i])) {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return true;
|
|
253
|
+
} else {
|
|
254
|
+
for (uint32_t i = start; i < start + nPrims; ++i) {
|
|
255
|
+
callback(primitives[i]);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
template <typename S>
|
|
261
|
+
template <typename Callback>
|
|
262
|
+
auto BvhFlatNode<S>::eachPrimitive(
|
|
263
|
+
std::vector<BoundingBox<S>>& primitives,
|
|
264
|
+
uint32_t startIndex,
|
|
265
|
+
Callback&& callback) {
|
|
266
|
+
static_assert(
|
|
267
|
+
std::is_invocable_v<Callback, BoundingBox<S>&>,
|
|
268
|
+
"Callback function must be invocable with a BoundingBox<S>& argument");
|
|
269
|
+
|
|
270
|
+
if constexpr (std::is_same_v<bool, std::invoke_result_t<Callback, BoundingBox<S>&>>) {
|
|
271
|
+
for (uint32_t i = start + startIndex; i < start + nPrims; ++i) {
|
|
272
|
+
if (!callback(primitives[i])) {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return true;
|
|
277
|
+
} else {
|
|
278
|
+
for (uint32_t i = start + startIndex; i < start + nPrims; ++i) {
|
|
279
|
+
callback(primitives[i]);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
template <typename S>
|
|
285
|
+
template <typename Callback>
|
|
286
|
+
auto BvhFlatNode<S>::eachPrimitive(
|
|
287
|
+
const std::vector<BoundingBox<S>>& primitives,
|
|
288
|
+
uint32_t startIndex,
|
|
289
|
+
Callback&& callback) const {
|
|
290
|
+
static_assert(
|
|
291
|
+
std::is_invocable_v<Callback, const BoundingBox<S>&>,
|
|
292
|
+
"Callback function must be invocable with a const BoundingBox<S>& argument");
|
|
293
|
+
|
|
294
|
+
if constexpr (std::is_same_v<bool, std::invoke_result_t<Callback, const BoundingBox<S>&>>) {
|
|
295
|
+
for (uint32_t i = start + startIndex; i < start + nPrims; ++i) {
|
|
296
|
+
if (!callback(primitives[i])) {
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return true;
|
|
301
|
+
} else {
|
|
302
|
+
for (uint32_t i = start + startIndex; i < start + nPrims; ++i) {
|
|
303
|
+
callback(primitives[i]);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
namespace {
|
|
309
|
+
|
|
310
|
+
template <typename S, typename Callback>
|
|
311
|
+
bool traverseCollision(
|
|
312
|
+
const std::vector<BvhFlatNode<S>>& nodesA,
|
|
313
|
+
const Size indexA,
|
|
314
|
+
const std::vector<BoundingBox<S>>& leafAabbsA,
|
|
315
|
+
const std::vector<BvhFlatNode<S>>& nodesB,
|
|
316
|
+
const Size indexB,
|
|
317
|
+
const std::vector<BoundingBox<S>>& leafAabbsB,
|
|
318
|
+
Callback&& func) {
|
|
319
|
+
// Retrieve the current nodes from both trees
|
|
320
|
+
const auto& nodeA = nodesA[indexA];
|
|
321
|
+
const auto& nodeB = nodesB[indexB];
|
|
322
|
+
|
|
323
|
+
// Early exit if bounding boxes of the current nodes do not intersect
|
|
324
|
+
if (!nodeA.bbox.intersects(nodeB.bbox)) {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Handle leaf-leaf intersection by checking all bounding boxes at the leaf nodes
|
|
329
|
+
if (nodeA.isLeaf() && nodeB.isLeaf()) {
|
|
330
|
+
nodeA.eachPrimitive(leafAabbsA, [&](const BoundingBox<S>& aabbA) -> bool {
|
|
331
|
+
return nodeB.eachPrimitive(leafAabbsB, [&](const BoundingBox<S>& aabbB) -> bool {
|
|
332
|
+
return func(aabbA.id, aabbB.id); // true means continue traversal
|
|
333
|
+
}); // true means continue traversal
|
|
334
|
+
});
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Determine which BVH to descend based on leaf status or bounding box size
|
|
339
|
+
const bool descendA = nodeB.isLeaf() ||
|
|
340
|
+
(!nodeA.isLeaf() && (nodeA.bbox.squaredVolume() > nodeB.bbox.squaredVolume()));
|
|
341
|
+
|
|
342
|
+
// Recursively traverse the chosen BVH and its sibling
|
|
343
|
+
const Size nextIndexA1 = descendA ? nodeA.getLeftIndex(indexA) : indexA;
|
|
344
|
+
const Size nextIndexA2 = descendA ? nodeA.getRightIndex(indexA) : indexA;
|
|
345
|
+
const Size nextIndexB1 = descendA ? indexB : nodeB.getLeftIndex(indexB);
|
|
346
|
+
const Size nextIndexB2 = descendA ? indexB : nodeB.getRightIndex(indexB);
|
|
347
|
+
return traverseCollision(
|
|
348
|
+
nodesA,
|
|
349
|
+
nextIndexA1,
|
|
350
|
+
leafAabbsA,
|
|
351
|
+
nodesB,
|
|
352
|
+
nextIndexB1,
|
|
353
|
+
leafAabbsB,
|
|
354
|
+
std::forward<Callback>(func)) ||
|
|
355
|
+
traverseCollision(
|
|
356
|
+
nodesA,
|
|
357
|
+
nextIndexA2,
|
|
358
|
+
leafAabbsA,
|
|
359
|
+
nodesB,
|
|
360
|
+
nextIndexB2,
|
|
361
|
+
leafAabbsB,
|
|
362
|
+
std::forward<Callback>(func));
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
template <typename S, typename Callback>
|
|
366
|
+
bool traverseSelfCollision(
|
|
367
|
+
const std::vector<BvhFlatNode<S>>& nodes,
|
|
368
|
+
const Size index,
|
|
369
|
+
const std::vector<BoundingBox<S>>& leafAabbs,
|
|
370
|
+
Callback&& func) {
|
|
371
|
+
const auto& node = nodes[index];
|
|
372
|
+
|
|
373
|
+
if (node.isLeaf()) {
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
const Size leftChildIndex = node.getLeftIndex(index);
|
|
378
|
+
if (traverseSelfCollision(nodes, leftChildIndex, leafAabbs, std::forward<Callback>(func))) {
|
|
379
|
+
return true;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
const Size rightChildIndex = node.getRightIndex(index);
|
|
383
|
+
if (traverseSelfCollision(nodes, rightChildIndex, leafAabbs, std::forward<Callback>(func))) {
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
if (traverseCollision(
|
|
388
|
+
nodes,
|
|
389
|
+
leftChildIndex,
|
|
390
|
+
leafAabbs,
|
|
391
|
+
nodes,
|
|
392
|
+
rightChildIndex,
|
|
393
|
+
leafAabbs,
|
|
394
|
+
std::forward<Callback>(func))) {
|
|
395
|
+
return true;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
} // namespace
|
|
402
|
+
|
|
403
|
+
template <typename S, size_t LeafCapacity>
|
|
404
|
+
template <typename ClosestSurfacePointFunc>
|
|
405
|
+
[[nodiscard]] ClosestSurfacePointResult<S> Bvh<S, LeafCapacity>::queryClosestSurfacePoint(
|
|
406
|
+
const Eigen::Vector3<S>& query,
|
|
407
|
+
ClosestSurfacePointFunc&& func) const {
|
|
408
|
+
// TODO(nemanjab): Implement this without recursion. It should be faster.
|
|
409
|
+
ClosestSurfacePointResult<S> res{};
|
|
410
|
+
if constexpr (std::is_invocable_r_v<
|
|
411
|
+
void,
|
|
412
|
+
ClosestSurfacePointFunc,
|
|
413
|
+
const Eigen::Vector3<S>&,
|
|
414
|
+
Index,
|
|
415
|
+
Eigen::Vector3<S>&>) {
|
|
416
|
+
queryClosestHelper</*IsPacket=*/false, /*NeedBarycentric=*/false>(
|
|
417
|
+
0, query, std::forward<ClosestSurfacePointFunc>(func), std::numeric_limits<S>::max(), res);
|
|
418
|
+
} else if (std::is_invocable_r_v<
|
|
419
|
+
void,
|
|
420
|
+
ClosestSurfacePointFunc,
|
|
421
|
+
const Eigen::Vector3<S>&,
|
|
422
|
+
Index,
|
|
423
|
+
Eigen::Vector3<S>&,
|
|
424
|
+
Eigen::Vector3<S>&>) {
|
|
425
|
+
queryClosestHelper</*IsPacket=*/false, /*NeedBarycentric=*/true>(
|
|
426
|
+
0, query, std::forward<ClosestSurfacePointFunc>(func), std::numeric_limits<S>::max(), res);
|
|
427
|
+
} else {
|
|
428
|
+
XR_CHECK(
|
|
429
|
+
false,
|
|
430
|
+
"Callback function must be invocable with query type, primitive ID and return the closest projection point.");
|
|
431
|
+
}
|
|
432
|
+
return res;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
template <typename S, size_t LeafCapacity>
|
|
436
|
+
template <typename ClosestSurfacePointFunc>
|
|
437
|
+
[[nodiscard]] ClosestSurfacePointResult<S> Bvh<S, LeafCapacity>::queryClosestSurfacePointPacket(
|
|
438
|
+
const Eigen::Vector3<S>& query,
|
|
439
|
+
ClosestSurfacePointFunc&& func) const {
|
|
440
|
+
// TODO(nemanjab, T176575677): Implement this without recursion. It should be faster.
|
|
441
|
+
ClosestSurfacePointResult<S> res{};
|
|
442
|
+
if constexpr (std::is_invocable_r_v<
|
|
443
|
+
void,
|
|
444
|
+
ClosestSurfacePointFunc,
|
|
445
|
+
const Eigen::Vector3<S>&,
|
|
446
|
+
const uint32_t,
|
|
447
|
+
const WideScalar<int32_t, LeafCapacity>&,
|
|
448
|
+
WideVec3<S, LeafCapacity>&,
|
|
449
|
+
WideScalar<S, LeafCapacity>&>) {
|
|
450
|
+
queryClosestHelper</*IsPacket=*/true, /*NeedBarycentric=*/false>(
|
|
451
|
+
0, query, std::forward<ClosestSurfacePointFunc>(func), std::numeric_limits<S>::max(), res);
|
|
452
|
+
} else if (std::is_invocable_r_v<
|
|
453
|
+
void,
|
|
454
|
+
ClosestSurfacePointFunc,
|
|
455
|
+
const Eigen::Vector3<S>&,
|
|
456
|
+
const uint32_t,
|
|
457
|
+
const WideScalar<int32_t, LeafCapacity>&,
|
|
458
|
+
WideVec3<S, LeafCapacity>&,
|
|
459
|
+
WideVec3<S, LeafCapacity>&,
|
|
460
|
+
WideScalar<S, LeafCapacity>&>) {
|
|
461
|
+
queryClosestHelper</*IsPacket=*/true, /*NeedBarycentric=*/true>(
|
|
462
|
+
0, query, std::forward<ClosestSurfacePointFunc>(func), std::numeric_limits<S>::max(), res);
|
|
463
|
+
} else {
|
|
464
|
+
XR_CHECK(
|
|
465
|
+
false,
|
|
466
|
+
"Callback function must be invocable with query, prim count, prim IDs and return projections and their distances through out param.");
|
|
467
|
+
}
|
|
468
|
+
return res;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
template <typename S, size_t LeafCapacity>
|
|
472
|
+
template <bool IsPacket, bool NeedBarycentric, typename ClosestSurfacePointFunc>
|
|
473
|
+
S Bvh<S, LeafCapacity>::queryClosestHelper(
|
|
474
|
+
const uint32_t nodeIdx,
|
|
475
|
+
const Eigen::Vector3<S>& query,
|
|
476
|
+
const ClosestSurfacePointFunc& func,
|
|
477
|
+
S sqrDist, // NOLINT
|
|
478
|
+
ClosestSurfacePointResult<S>& result) const {
|
|
479
|
+
const auto& currNode = flatTree_[nodeIdx];
|
|
480
|
+
|
|
481
|
+
// If we hit the leaf, update the closest distance.
|
|
482
|
+
if (currNode.isLeaf()) {
|
|
483
|
+
// We can still send non-packet query even if LeafCapacity is bigger than 1, which is good for
|
|
484
|
+
// debugging.
|
|
485
|
+
if constexpr (IsPacket) {
|
|
486
|
+
// We send up to N (depending on leaf capacity) primitives at once.
|
|
487
|
+
// The callback can use packet-based vectorization for data parallelism.
|
|
488
|
+
std::array<uint32_t, LeafCapacity> primIndices; // NOLINT
|
|
489
|
+
for (uint32_t o = 0; o < currNode.nPrims; ++o) {
|
|
490
|
+
primIndices[o] = buildPrimitives_[currNode.start + o].id;
|
|
491
|
+
}
|
|
492
|
+
WideVec3<S, LeafCapacity> projections;
|
|
493
|
+
WideScalar<S, LeafCapacity> squaredDistances;
|
|
494
|
+
[[maybe_unused]] WideVec3<S, LeafCapacity> barycentrics;
|
|
495
|
+
if constexpr (NeedBarycentric) {
|
|
496
|
+
func(
|
|
497
|
+
query,
|
|
498
|
+
currNode.nPrims,
|
|
499
|
+
drjit::load<WideScalar<int32_t, LeafCapacity>>(primIndices.data()),
|
|
500
|
+
projections,
|
|
501
|
+
barycentrics,
|
|
502
|
+
squaredDistances);
|
|
503
|
+
} else {
|
|
504
|
+
func(
|
|
505
|
+
query,
|
|
506
|
+
currNode.nPrims,
|
|
507
|
+
drjit::load<WideScalar<int32_t, LeafCapacity>>(primIndices.data()),
|
|
508
|
+
projections,
|
|
509
|
+
squaredDistances);
|
|
510
|
+
}
|
|
511
|
+
for (int i = 0; i < currNode.nPrims; ++i) {
|
|
512
|
+
if (squaredDistances[i] < sqrDist) {
|
|
513
|
+
sqrDist = squaredDistances[i];
|
|
514
|
+
result.point = Eigen::Vector3<S>{projections[0][i], projections[1][i], projections[2][i]};
|
|
515
|
+
result.triangleIdx = primIndices[i];
|
|
516
|
+
if constexpr (NeedBarycentric) {
|
|
517
|
+
result.baryCoords =
|
|
518
|
+
Eigen::Vector3<S>{barycentrics[0][i], barycentrics[1][i], barycentrics[2][i]};
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
} else {
|
|
523
|
+
// The base scalar case.
|
|
524
|
+
for (uint32_t o = 0; o < currNode.nPrims; ++o) {
|
|
525
|
+
const BoundingBox<S>& obj = buildPrimitives_[currNode.start + o];
|
|
526
|
+
Eigen::Vector3<S> projection;
|
|
527
|
+
[[maybe_unused]] Eigen::Vector3<S> barycentric;
|
|
528
|
+
if constexpr (NeedBarycentric) {
|
|
529
|
+
func(query, obj.id, projection, barycentric);
|
|
530
|
+
} else {
|
|
531
|
+
func(query, obj.id, projection);
|
|
532
|
+
}
|
|
533
|
+
const S distSq = (projection - query).squaredNorm();
|
|
534
|
+
if (distSq < sqrDist) {
|
|
535
|
+
result.point = std::move(projection);
|
|
536
|
+
result.triangleIdx = obj.id;
|
|
537
|
+
if constexpr (NeedBarycentric) {
|
|
538
|
+
result.baryCoords = std::move(barycentric);
|
|
539
|
+
}
|
|
540
|
+
sqrDist = distSq;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
} else {
|
|
545
|
+
const auto& checkSubtree = [this, &query, &sqrDist, &func, &result](const uint32_t nodeIdx) {
|
|
546
|
+
ClosestSurfacePointResult<S> tempRes;
|
|
547
|
+
const S distSq =
|
|
548
|
+
queryClosestHelper<IsPacket, NeedBarycentric>(nodeIdx, query, func, sqrDist, tempRes);
|
|
549
|
+
if (distSq < sqrDist) {
|
|
550
|
+
sqrDist = distSq;
|
|
551
|
+
result = tempRes;
|
|
552
|
+
}
|
|
553
|
+
};
|
|
554
|
+
|
|
555
|
+
const auto& leftBox = flatTree_[currNode.getLeftIndex(nodeIdx)].bbox.aabb;
|
|
556
|
+
const auto& rightBox = flatTree_[currNode.getRightIndex(nodeIdx)].bbox.aabb;
|
|
557
|
+
|
|
558
|
+
// If we are inside an intermediate box, we need to explore the whole subtree.
|
|
559
|
+
// This is because the primitive could be at any distance from the query.
|
|
560
|
+
const bool checkedLeftSubtree = leftBox.contains(query);
|
|
561
|
+
if (checkedLeftSubtree) {
|
|
562
|
+
checkSubtree(currNode.getLeftIndex(nodeIdx));
|
|
563
|
+
}
|
|
564
|
+
const bool checkedRightSubtree = rightBox.contains(query);
|
|
565
|
+
if (checkedRightSubtree) {
|
|
566
|
+
checkSubtree(currNode.getRightIndex(nodeIdx));
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// For the case where the query isn't inside, we'll need distance to the AABBs.
|
|
570
|
+
const S leftExtDistSq = leftBox.squaredExteriorDistance(query);
|
|
571
|
+
const S rightExtDistSq = rightBox.squaredExteriorDistance(query);
|
|
572
|
+
if (leftExtDistSq < rightExtDistSq) {
|
|
573
|
+
if (!checkedLeftSubtree && leftExtDistSq < sqrDist) {
|
|
574
|
+
checkSubtree(currNode.getLeftIndex(nodeIdx));
|
|
575
|
+
}
|
|
576
|
+
if (!checkedRightSubtree && rightExtDistSq < sqrDist) {
|
|
577
|
+
checkSubtree(currNode.getRightIndex(nodeIdx));
|
|
578
|
+
}
|
|
579
|
+
} else {
|
|
580
|
+
if (!checkedRightSubtree && rightExtDistSq < sqrDist) {
|
|
581
|
+
checkSubtree(currNode.getRightIndex(nodeIdx));
|
|
582
|
+
}
|
|
583
|
+
if (!checkedLeftSubtree && leftExtDistSq < sqrDist) {
|
|
584
|
+
checkSubtree(currNode.getLeftIndex(nodeIdx));
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
return sqrDist;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
template <typename S, size_t LeafCapacity>
|
|
593
|
+
template <typename ReturnType, typename RayPrimitiveIntersector>
|
|
594
|
+
ReturnType Bvh<S, LeafCapacity>::rayQueryClosestHit(
|
|
595
|
+
const Eigen::Vector3<S>& origin,
|
|
596
|
+
const Eigen::Vector3<S>& direction,
|
|
597
|
+
S /* minT */,
|
|
598
|
+
S maxT,
|
|
599
|
+
RayPrimitiveIntersector&& func) const {
|
|
600
|
+
static_assert(
|
|
601
|
+
std::is_invocable_r_v<void, RayPrimitiveIntersector, Index, ReturnType&, S&>,
|
|
602
|
+
"Callback function must be invocable with a primitive index, result type to update and maximum distance to update.");
|
|
603
|
+
|
|
604
|
+
std::array<uint32_t, kMaxStackDepth> todoStack{};
|
|
605
|
+
Index stackLevel = 0;
|
|
606
|
+
todoStack[stackLevel] = 0; // Start from the root, node 0.
|
|
607
|
+
|
|
608
|
+
ReturnType result{};
|
|
609
|
+
|
|
610
|
+
const Eigen::Vector3<S> dirInv = direction.cwiseInverse();
|
|
611
|
+
while (stackLevel >= 0) {
|
|
612
|
+
// Pop off the next node to work on.
|
|
613
|
+
const auto currNode = todoStack[stackLevel--];
|
|
614
|
+
const auto& node(flatTree_[currNode]);
|
|
615
|
+
|
|
616
|
+
// This is the leaf condition.
|
|
617
|
+
if (node.isLeaf()) {
|
|
618
|
+
node.eachPrimitive(
|
|
619
|
+
buildPrimitives_, [&](const BoundingBox<S>& prim) { func(prim.id, result, maxT); });
|
|
620
|
+
} else { // Not a leaf => internal node with 2 children boxes.
|
|
621
|
+
if (flatTree_[node.getLeftIndex(currNode)].bbox.intersectsBranchless(origin, dirInv)) {
|
|
622
|
+
todoStack[++stackLevel] = node.getLeftIndex(currNode);
|
|
623
|
+
}
|
|
624
|
+
if (flatTree_[node.getRightIndex(currNode)].bbox.intersectsBranchless(origin, dirInv)) {
|
|
625
|
+
todoStack[++stackLevel] = node.getRightIndex(currNode);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
return result;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
template <typename S, size_t LeafCapacity>
|
|
633
|
+
template <typename RayPrimitiveIntersector>
|
|
634
|
+
bool Bvh<S, LeafCapacity>::rayQueryAnyHit(
|
|
635
|
+
const Eigen::Vector3<S>& origin,
|
|
636
|
+
const Eigen::Vector3<S>& direction,
|
|
637
|
+
S /* minT */,
|
|
638
|
+
S /* maxT */,
|
|
639
|
+
RayPrimitiveIntersector&& func) const {
|
|
640
|
+
static_assert(
|
|
641
|
+
std::is_invocable_r_v<bool, RayPrimitiveIntersector, Index>,
|
|
642
|
+
"Callback function must be invocable with a primitive index and return if the hit was valid.");
|
|
643
|
+
|
|
644
|
+
std::array<uint32_t, kMaxStackDepth> todoStack{};
|
|
645
|
+
Index stackLevel = 0;
|
|
646
|
+
todoStack[stackLevel] = 0; // Start from the root, node 0.
|
|
647
|
+
|
|
648
|
+
const Eigen::Vector3<S> dirInv = direction.cwiseInverse();
|
|
649
|
+
while (stackLevel >= 0) {
|
|
650
|
+
// Pop off the next node to work on.
|
|
651
|
+
const auto currNode = todoStack[stackLevel--];
|
|
652
|
+
const auto& node(flatTree_[currNode]);
|
|
653
|
+
|
|
654
|
+
// Is leaf -> Intersect
|
|
655
|
+
if (node.isLeaf()) {
|
|
656
|
+
for (Index o = 0; o < node.nPrims; ++o) {
|
|
657
|
+
if (func(buildPrimitives_[node.start + o].id)) {
|
|
658
|
+
return true;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
} else { // Not a leaf => internal node with 2 children boxes.
|
|
662
|
+
if (flatTree_[node.getLeftIndex(currNode)].bbox.intersectsBranchless(origin, dirInv)) {
|
|
663
|
+
todoStack[++stackLevel] = node.getLeftIndex(currNode);
|
|
664
|
+
}
|
|
665
|
+
if (flatTree_[node.getRightIndex(currNode)].bbox.intersectsBranchless(origin, dirInv)) {
|
|
666
|
+
todoStack[++stackLevel] = node.getRightIndex(currNode);
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
return false;
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
template <typename S, size_t LeafCapacity>
|
|
674
|
+
template <typename Callback>
|
|
675
|
+
void Bvh<S, LeafCapacity>::traverseOverlappingPairs(Callback&& func) const {
|
|
676
|
+
static_assert(
|
|
677
|
+
std::is_invocable_r_v<bool, Callback, Index, Index>,
|
|
678
|
+
"Callback function must be invocable with two Index arguments and return bool");
|
|
679
|
+
|
|
680
|
+
if (nodeCount_ == 0) {
|
|
681
|
+
return;
|
|
682
|
+
}
|
|
683
|
+
traverseSelfCollision<S>(flatTree_, 0, buildPrimitives_, std::forward<Callback>(func));
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
template <typename S, size_t LeafCapacity>
|
|
687
|
+
template <typename Callback>
|
|
688
|
+
void Bvh<S, LeafCapacity>::traverseOverlappingPairs(
|
|
689
|
+
const Bvh<S, LeafCapacity>& other,
|
|
690
|
+
Callback&& func) const {
|
|
691
|
+
static_assert(
|
|
692
|
+
std::is_invocable_r_v<bool, Callback, Index, Index>,
|
|
693
|
+
"Callback function must be invocable with two Index arguments and return bool");
|
|
694
|
+
|
|
695
|
+
if (nodeCount_ == 0 || other.nodeCount_ == 0) {
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
traverseCollision(
|
|
699
|
+
flatTree_,
|
|
700
|
+
0,
|
|
701
|
+
buildPrimitives_,
|
|
702
|
+
other.flatTree_,
|
|
703
|
+
0,
|
|
704
|
+
other.buildPrimitives_,
|
|
705
|
+
std::forward<Callback>(func));
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
} // namespace axel
|