diff --git a/.clang-tidy b/.clang-tidy index 1ad12ab..d243816 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -18,6 +18,7 @@ Checks: > -readability-implicit-bool-conversion, -readability-avoid-const-params-in-decls, -readability-braces-around-statements, + -readability-convert-member-functions-to-static, -readability-isolate-declaration, -readability-math-missing-parentheses, -cppcoreguidelines-avoid-magic-numbers, diff --git a/CMakeLists.txt b/CMakeLists.txt index 07d6ab7..b5e61d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,8 @@ add_library(genmetaballs_core genmetaballs/src/cuda/core/camera.cuh genmetaballs/src/cuda/core/utils.cu genmetaballs/src/cuda/core/utils.cuh + genmetaballs/src/cuda/core/fmb.cuh + genmetaballs/src/cuda/core/fmb.cu genmetaballs/src/cuda/core/geometry.cuh genmetaballs/src/cuda/core/geometry.cu genmetaballs/src/cuda/core/confidence.cuh diff --git a/genmetaballs/src/cuda/bindings.cu b/genmetaballs/src/cuda/bindings.cu index 3ae2652..ff3850b 100644 --- a/genmetaballs/src/cuda/bindings.cu +++ b/genmetaballs/src/cuda/bindings.cu @@ -2,11 +2,13 @@ #include #include #include +#include #include #include "core/blender.cuh" #include "core/camera.cuh" #include "core/confidence.cuh" +#include "core/fmb.cuh" #include "core/geometry.cuh" #include "core/image.cuh" #include "core/utils.cuh" @@ -22,6 +24,23 @@ void bind_image_view(nb::module_& m, const char* name); NB_MODULE(_genmetaballs_bindings, m) { + /* + * FMB module bindings + */ + + nb::module_ fmb = m.def_submodule("fmb", "Fuzzy meta ball data types"); + + nb::class_(fmb, "FMB") + .def(nb::init()) + .def_prop_ro("pose", &FMB::get_pose) + .def_prop_ro("extent", + [](const FMB& self) { + auto extent = self.get_extent(); + return std::tuple{extent.x, extent.y, extent.z}; + }) + .def("quadratic_form", &FMB::quadratic_form, + "Evaluate the associated quadratic form at the given vector", nb::arg("vec")); + /* * Geometry module bindings */ diff --git a/genmetaballs/src/cuda/core/fmb.cu b/genmetaballs/src/cuda/core/fmb.cu new file mode 100644 index 0000000..83d9cdc --- /dev/null +++ b/genmetaballs/src/cuda/core/fmb.cu @@ -0,0 +1,33 @@ +#include "fmb.cuh" +#include "geometry.cuh" +#include "utils.cuh" + +CUDA_CALLABLE float FMB::quadratic_form(const Vec3D vec) const { + const auto shftd_vec = vec - pose_.get_tran(); + const auto rot_shftd_vec = pose_.get_rot().apply(shftd_vec); + const auto scaled_rot_shftd_vec = Vec3D( + rot_shftd_vec.x / extent_.x, rot_shftd_vec.y / extent_.y, rot_shftd_vec.z / extent_.z); + return dot(rot_shftd_vec, scaled_rot_shftd_vec); +} + +template <> +__host__ FMBScene::FMBScene(size_t size) + : fmbs_{new FMB[size]}, log_weights_{new float[size]}, size_{size} {} + +template <> +__host__ FMBScene::FMBScene(size_t size) : size_{size} { + CUDA_CHECK(cudaMalloc(&fmbs_, size * sizeof(FMB))); + CUDA_CHECK(cudaMalloc(&log_weights_, size * sizeof(float))); +} + +template <> +__host__ FMBScene::~FMBScene() { + delete[] fmbs_; + delete[] log_weights_; +} + +template <> +__host__ FMBScene::~FMBScene() { + CUDA_CHECK(cudaFree(fmbs_)); + CUDA_CHECK(cudaFree(log_weights_)); +} diff --git a/genmetaballs/src/cuda/core/fmb.cuh b/genmetaballs/src/cuda/core/fmb.cuh index bf2f162..94242be 100644 --- a/genmetaballs/src/cuda/core/fmb.cuh +++ b/genmetaballs/src/cuda/core/fmb.cuh @@ -1,26 +1,116 @@ #pragma once +#include +#include +#include + #include "geometry.cuh" +#include "utils.cuh" + +class FMB { +private: + // In Gaussian terms: + // - mean: pose.tran + // - cov: pose.rot.mat().inv() * diag(extent) * pose.rot.mat() + Pose pose_; + float3 extent_; + +public: + FMB() : pose_{}, extent_{1.0f, 1.0f, 1.0f} {}; + + FMB(const Pose& pose, float x_extent, float y_extent, float z_extent) noexcept(false) + : pose_{pose} { + if (x_extent <= 0 || y_extent <= 0 || z_extent <= 0) + throw std::domain_error("a metaball cannot have negative extent"); + extent_ = {x_extent, y_extent, z_extent}; + } + + CUDA_CALLABLE Pose get_pose() const { + return pose_; + } + CUDA_CALLABLE float3 get_extent() const { + return extent_; + } -struct FMB { - Pose pose; // mean + orientation - float3 extent; + CUDA_CALLABLE float quadratic_form(const Vec3D) const; }; -template