1010#include " core/camera.cuh"
1111#include " core/confidence.cuh"
1212#include " core/fmb.cuh"
13+ #include " core/forward.cuh"
1314#include " core/geometry.cuh"
15+ #include " core/getter.cuh"
1416#include " core/image.cuh"
1517#include " core/intersector.cuh"
1618#include " core/utils.cuh"
@@ -25,6 +27,8 @@ template <MemoryLocation location>
2527void bind_image_view (nb::module_& m, const char * name);
2628template <MemoryLocation location>
2729void bind_fmb_scene (nb::module_& m, const char * name);
30+ template <typename Blender, typename Confidence>
31+ void bind_render_fmbs (nb::module_& m, const char * name);
2832
2933NB_MODULE (_genmetaballs_bindings, m) {
3034
@@ -41,7 +45,7 @@ NB_MODULE(_genmetaballs_bindings, m) {
4145 [](const ZeroParameterConfidence& c) { return nb::str (" ZeroParameterConfidence()" ); });
4246
4347 nb::class_<TwoParameterConfidence>(confidence, " TwoParameterConfidence" )
44- .def (nb::init<float , float >())
48+ .def (nb::init<float , float >(), nb::arg ( " beta4 " ), nb::arg ( " beta5 " ) )
4549 .def_ro (" beta4" , &TwoParameterConfidence::beta4)
4650 .def_ro (" beta5" , &TwoParameterConfidence::beta5)
4751 .def (" get_confidence" , &TwoParameterConfidence::get_confidence, nb::arg (" sumexpd" ),
@@ -67,10 +71,26 @@ NB_MODULE(_genmetaballs_bindings, m) {
6771 .def (" cov_inv_apply" , &FMB::cov_inv_apply,
6872 " apply the inverse covariance matrix to the given vector" , nb::arg (" vec" ))
6973 .def (" quadratic_form" , &FMB::quadratic_form,
70- " Evaluate the associated quadratic form at the given vector" , nb::arg (" vec" ));
74+ " Evaluate the associated quadratic form at the given vector" , nb::arg (" vec" ))
75+ .def (" __repr__" , [](const FMB& self) {
76+ return nb::str (" FMB(pose={}, extent={})" ).format (self.get_pose (), self.get_extent ());
77+ });
7178 bind_fmb_scene<MemoryLocation::HOST>(fmb, " CPUFMBScene" );
7279 bind_fmb_scene<MemoryLocation::DEVICE>(fmb, " GPUFMBScene" );
7380
81+ /*
82+ * Forward (rendering) module bindings
83+ */
84+ nb::module_ forward = m.def_submodule (" forward" , " Forward rendering of FMBs" );
85+ bind_render_fmbs<FourParameterBlender, ZeroParameterConfidence>(
86+ forward, " render_fmbs_four_param_zero_confidence" );
87+ bind_render_fmbs<ThreeParameterBlender, TwoParameterConfidence>(
88+ forward, " render_fmbs_three_param_two_confidence" );
89+ bind_render_fmbs<ThreeParameterBlender, ZeroParameterConfidence>(
90+ forward, " render_fmbs_three_param_zero_confidence" );
91+ bind_render_fmbs<FourParameterBlender, TwoParameterConfidence>(
92+ forward, " render_fmbs_four_param_two_confidence" );
93+
7494 /*
7595 * Geometry module bindings
7696 */
@@ -99,9 +119,21 @@ NB_MODULE(_genmetaballs_bindings, m) {
99119 .def (nb::init<>())
100120 .def_static (" from_quat" , &Rotation::from_quat, " Create rotation from quaternion" ,
101121 nb::arg (" x" ), nb::arg (" y" ), nb::arg (" z" ), nb::arg (" w" ))
122+ .def_prop_ro (
123+ " quat" ,
124+ [](const Rotation& self) {
125+ auto quat = self.get_quat ();
126+ return std::tuple{quat.x , quat.y , quat.z , quat.w };
127+ },
128+ " Get quaternion components as (x, y, z, w)" )
102129 .def (" apply" , &Rotation::apply, " Apply rotation to vector" , nb::arg (" vec" ))
103130 .def (" compose" , &Rotation::compose, " Compose with another rotation" , nb::arg (" rot" ))
104- .def (" inv" , &Rotation::inv, " Inverse rotation" );
131+ .def (" inv" , &Rotation::inv, " Inverse rotation" )
132+ .def (" __repr__" , [](const Rotation& self) {
133+ auto quat = self.get_quat ();
134+ return nb::str (" Rotation(x={}, y={}, z={}, w={})" )
135+ .format (quat.x , quat.y , quat.z , quat.w );
136+ });
105137
106138 nb::class_<Pose>(geometry, " Pose" )
107139 .def (nb::init<>())
@@ -112,15 +144,17 @@ NB_MODULE(_genmetaballs_bindings, m) {
112144 .def_prop_ro (" tran" , &Pose::get_tran, " get the translation component" )
113145 .def (" apply" , &Pose::apply, " Apply pose to vector" , nb::arg (" vec" ))
114146 .def (" compose" , &Pose::compose, " Compose with another pose" , nb::arg (" pose" ))
115- .def (" inv" , &Pose::inv, " Inverse pose" );
116-
147+ .def (" inv" , &Pose::inv, " Inverse pose" )
148+ .def (" __repr__" , [](const Pose& self) {
149+ return nb::str (" Pose(rot={}, tran={})" ).format (self.get_rot (), self.get_tran ());
150+ });
117151 /*
118152 * Camera module bindings
119153 */
120154 nb::module_ camera = m.def_submodule (" camera" , " Camera intrinsics and extrinsics" );
121155 nb::class_<Intrinsics>(camera, " Intrinsics" )
122- .def (nb::init<uint32_t , uint32_t , float , float , float , float >(), nb::arg (" height " ),
123- nb::arg (" width " ), nb::arg (" fx" ), nb::arg (" fy" ), nb::arg (" cx" ), nb::arg (" cy" ))
156+ .def (nb::init<uint32_t , uint32_t , float , float , float , float >(), nb::arg (" width " ),
157+ nb::arg (" height " ), nb::arg (" fx" ), nb::arg (" fy" ), nb::arg (" cx" ), nb::arg (" cy" ))
124158 .def_ro (" height" , &Intrinsics::height)
125159 .def_ro (" width" , &Intrinsics::width)
126160 .def_ro (" fx" , &Intrinsics::fx)
@@ -129,7 +163,11 @@ NB_MODULE(_genmetaballs_bindings, m) {
129163 .def_ro (" cy" , &Intrinsics::cy)
130164 .def (" get_ray_direction" , &Intrinsics::get_ray_direction,
131165 " Get the direction of the ray going through pixel (px, py) in camera frame" ,
132- nb::arg (" px" ), nb::arg (" py" ));
166+ nb::arg (" px" ), nb::arg (" py" ))
167+ .def (" __repr__" , [](const Intrinsics& self) {
168+ return nb::str (" Intrinsics(width={}, height={}, fx={}, fy={}, cx={}, cy={})" )
169+ .format (self.width , self.height , self.fx , self.fy , self.cx , self.cy );
170+ });
133171
134172 /*
135173 * Image module bindings
@@ -163,7 +201,8 @@ NB_MODULE(_genmetaballs_bindings, m) {
163201 // blender submodule
164202 nb::module_ blender = m.def_submodule (" blender" );
165203 nb::class_<FourParameterBlender>(blender, " FourParameterBlender" )
166- .def (nb::init<float , float , float , float >())
204+ .def (nb::init<float , float , float , float >(), nb::arg (" beta1" ), nb::arg (" beta2" ),
205+ nb::arg (" beta3" ), nb::arg (" eta" ))
167206 .def_ro (" beta1" , &FourParameterBlender::beta1)
168207 .def_ro (" beta2" , &FourParameterBlender::beta2)
169208 .def_ro (" beta3" , &FourParameterBlender::beta3)
@@ -176,7 +215,7 @@ NB_MODULE(_genmetaballs_bindings, m) {
176215 });
177216
178217 nb::class_<ThreeParameterBlender>(blender, " ThreeParameterBlender" )
179- .def (nb::init<float , float , float >())
218+ .def (nb::init<float , float , float >(), nb::arg ( " beta1 " ), nb::arg ( " beta2 " ), nb::arg ( " eta " ) )
180219 .def_ro (" beta1" , &ThreeParameterBlender::beta1)
181220 .def_ro (" beta2" , &ThreeParameterBlender::beta2)
182221 .def_ro (" eta" , &ThreeParameterBlender::eta)
@@ -273,3 +312,12 @@ void bind_fmb_scene(nb::module_& m, const char* name) {
273312 return nb::str (" {}(size={})" ).format (name, scene.size ());
274313 });
275314}
315+
316+ template <typename Blender, typename Confidence>
317+ void bind_render_fmbs (nb::module_& m, const char * name) {
318+ m.def (name,
319+ &render_fmbs<AllGetter<MemoryLocation::DEVICE>, LinearIntersector, Blender, Confidence>,
320+ " Render the given FMB scene into the provided image view" , nb::arg (" fmbs" ),
321+ nb::arg (" blender" ), nb::arg (" confidence" ), nb::arg (" intr" ), nb::arg (" extr" ),
322+ nb::arg (" img" ));
323+ }
0 commit comments