diff --git a/network_process/src/prim_gen/extract_vertex_infos.cpp b/network_process/src/prim_gen/extract_vertex_infos.cpp index fec3ce8..c39ab4d 100644 --- a/network_process/src/prim_gen/extract_vertex_infos.cpp +++ b/network_process/src/prim_gen/extract_vertex_infos.cpp @@ -10,8 +10,7 @@ aabb_t mark_primitive_boundings(double aabb_margin, const baked_blobtree_t& tree aabb_t scene_aabb{}; for (const auto [primitive_ptr, _] : tree.primitives) { const auto& primitive = *primitive_ptr; - auto local_to_world_matrix = primitive.get_identity_local_to_world(); - aabb_t primitive_aabb = aabb_unit.transformed(local_to_world_matrix); + aabb_t primitive_aabb = primitive.fetch_aabb(); primitive_aabb.min().array() -= aabb_margin; primitive_aabb.max().array() += aabb_margin; scene_aabb.extend(primitive_aabb); diff --git a/primitive_process/interface/base/primitive.hpp b/primitive_process/interface/base/primitive.hpp index b0cf6e1..4ef18d2 100644 --- a/primitive_process/interface/base/primitive.hpp +++ b/primitive_process/interface/base/primitive.hpp @@ -12,6 +12,7 @@ template using marked_subface_ptr_t = marked_ptr; +using aabb_t = Eigen::AlignedBox; enum class sign_t : uint8_t { positive = 1, negative = 2, zero = 0 }; @@ -52,17 +53,14 @@ EXTERN_C struct PE_API primitive { virtual primitive_type get_type() const = 0; virtual marked_subface_ptr_t *get_subface() const = 0; virtual size_t get_subface_count() const = 0; + aabb_t m_aabb = aabb_t(Eigen::Vector3d(-1, -1, -1), Eigen::Vector3d(1, 1, 1)); // sign_t judge_sign_by_subface_sdf(const std::vector &) const; // sign_t judge_sign_by_subface_sdf_sign(const std::vector &) const; dynamic_bitset_mp<> judge_sign_by_subface_sign(stl_vector_mp>) const; - // for simple primitive: sphere, cylinder, cone, box - // we use world_to_local as OBB and judge inside/outside by [-1, 1]^3 - // so we don't need to fetch aabb anymore - // aabb fetch_aabb() const; - // CAUTION: keep characteristics local_to_world as the first subface's part - const internal::transform_block &get_identity_local_to_world() const; + + aabb_t fetch_aabb() const; void apply_transform(internal::transform_type, Eigen::Vector4d); diff --git a/primitive_process/src/base/primitive.cpp b/primitive_process/src/base/primitive.cpp index 6d7c596..16a9c36 100644 --- a/primitive_process/src/base/primitive.cpp +++ b/primitive_process/src/base/primitive.cpp @@ -42,9 +42,9 @@ dynamic_bitset_mp<> primitive::judge_sign_by_subface_sign(stl_vector_mpraw_local_to_world(); + return m_aabb; } void primitive::apply_transform(internal::transform_type type, Eigen::Vector4d param) @@ -59,5 +59,22 @@ void primitive::apply_transform(internal::transform_type type, Eigen::Vector4d p new_model_matrices.emplace_back(subface_ptr->apply_transform(type, param)); } + // aabb + Eigen::Affine3d affine = Eigen::Affine3d::Identity(); + switch (type) { + case internal::transform_type::scale: { + affine.linear() = param.head<3>().asDiagonal(); + } break; + case internal::transform_type::rotation: { + affine.linear() = Eigen::Quaterniond(param).toRotationMatrix(); + } break; + case internal::transform_type::translation: { + Eigen::Translation3d translation(param.head<3>()); + affine = Eigen::Affine3d(translation); + } break; + default: throw std::invalid_argument("Invalid transform type"); + } + m_aabb = m_aabb.transformed(affine); + initialize(*subfaces[0].get_ptr()->data_center, new_model_matrices); } \ No newline at end of file