| 106 | } // namespace |
| 107 | |
| 108 | void register_splat_simplify(nb::module_& m) { |
| 109 | nb::class_<PySplatSimplifyMergeTree>(m, "SplatSimplifyMergeTree") |
| 110 | .def_prop_ro("source_means", &PySplatSimplifyMergeTree::source_means, |
| 111 | "Filtered source means tensor [N, 3]") |
| 112 | .def_prop_ro("source_sh0", &PySplatSimplifyMergeTree::source_sh0, |
| 113 | "Filtered source SH0 tensor [N, 1, 3]") |
| 114 | .def_prop_ro("source_shN", &PySplatSimplifyMergeTree::source_shN, |
| 115 | "Filtered source higher-order SH tensor [N, K, 3]") |
| 116 | .def_prop_ro("source_scaling", &PySplatSimplifyMergeTree::source_scaling, |
| 117 | "Filtered source scaling tensor [N, 3] in log-space") |
| 118 | .def_prop_ro("source_rotation", &PySplatSimplifyMergeTree::source_rotation, |
| 119 | "Filtered source rotation tensor [N, 4]") |
| 120 | .def_prop_ro("source_opacity", &PySplatSimplifyMergeTree::source_opacity, |
| 121 | "Filtered source opacity tensor [N, 1] in logit-space") |
| 122 | .def_prop_ro("source_active_sh_degree", &PySplatSimplifyMergeTree::source_active_sh_degree, |
| 123 | "Active SH degree of the filtered source splat") |
| 124 | .def_prop_ro("source_max_sh_degree", &PySplatSimplifyMergeTree::source_max_sh_degree, |
| 125 | "Maximum SH degree of the filtered source splat") |
| 126 | .def_prop_ro("source_scene_scale", &PySplatSimplifyMergeTree::source_scene_scale, |
| 127 | "Scene scale of the filtered source splat") |
| 128 | .def_prop_ro("target_count", &PySplatSimplifyMergeTree::target_count, |
| 129 | "Requested target count before pruning") |
| 130 | .def_prop_ro("post_prune_count", &PySplatSimplifyMergeTree::post_prune_count, |
| 131 | "Count remaining after opacity pruning") |
| 132 | .def_prop_ro("requested_ratio", &PySplatSimplifyMergeTree::requested_ratio, |
| 133 | "Requested simplify ratio") |
| 134 | .def_prop_ro("requested_lod_base", &PySplatSimplifyMergeTree::requested_lod_base, |
| 135 | "Requested LOD base factor") |
| 136 | .def_prop_ro("requested_opacity_prune_threshold", |
| 137 | &PySplatSimplifyMergeTree::requested_opacity_prune_threshold, |
| 138 | "Requested opacity prune threshold") |
| 139 | .def_prop_ro("final_roots", &PySplatSimplifyMergeTree::final_roots, |
| 140 | "Tree node ids that survive into the simplified output") |
| 141 | .def_prop_ro("pruned_leaf_ids", &PySplatSimplifyMergeTree::pruned_leaf_ids, |
| 142 | "Leaf ids removed during the initial opacity prune") |
| 143 | .def_prop_ro("merge_left", &PySplatSimplifyMergeTree::merge_left, |
| 144 | "Left child id for each merge node") |
| 145 | .def_prop_ro("merge_right", &PySplatSimplifyMergeTree::merge_right, |
| 146 | "Right child id for each merge node") |
| 147 | .def_prop_ro("merge_pass", &PySplatSimplifyMergeTree::merge_pass, |
| 148 | "Zero-based simplify pass index for each merge node") |
| 149 | .def("leaf_count", &PySplatSimplifyMergeTree::leaf_count, |
| 150 | "Number of source leaves in the tree") |
| 151 | .def("merge_count", &PySplatSimplifyMergeTree::merge_count, |
| 152 | "Number of merge nodes in the tree"); |
| 153 | |
| 154 | nb::class_<PySplatSimplifyResult>(m, "SplatSimplifyResult") |
| 155 | .def_prop_ro("splat_data", &PySplatSimplifyResult::splat_data, |
| 156 | "Simplified output splat data") |
| 157 | .def_prop_ro("merge_tree", &PySplatSimplifyResult::merge_tree, |
| 158 | "Merge tree describing how the output was formed"); |
| 159 | |
| 160 | m.def( |
| 161 | "simplify_splats", |
| 162 | [](const std::string& source_name, |
| 163 | double ratio, |
| 164 | float lod_base, |
| 165 | float opacity_prune_threshold) { |
no test coverage detected