|
|
|
@ -44,14 +44,6 @@ dynamic_bitset_mp<> primitive::judge_sign_by_subface_sign(const stl_vector_mp<dy |
|
|
|
return res; |
|
|
|
} |
|
|
|
|
|
|
|
// void primitive::initialize(primitive_data_center_t &data_center)
|
|
|
|
// {
|
|
|
|
// this->data_center = make_pointer_wrapper(data_center);
|
|
|
|
|
|
|
|
// auto subface_init_model_matrices = get_subface_init_model_matrices();
|
|
|
|
// initialize(subface_init_model_matrices);
|
|
|
|
// }
|
|
|
|
|
|
|
|
void primitive::initialize(const stl_vector_mp<internal::paired_model_matrix_ptr_t>& matrices, |
|
|
|
const stl_vector_mp<bool>& reversed_flags, |
|
|
|
const stl_vector_mp<const void*>& geometry, |
|
|
|
@ -59,7 +51,7 @@ void primitive::initialize(const stl_vector_mp<internal::paired_model_matrix_ptr |
|
|
|
{ |
|
|
|
auto subfaces = get_subfaces(); |
|
|
|
auto subface_types = get_subface_types(); |
|
|
|
// 阶段2: 创建 surface(geometry 所有权转移到 surface)
|
|
|
|
// 创建 surface(geometry 所有权转移到 surface)
|
|
|
|
stl_vector_mp<const void*> raw_geometry = geometry.empty() ? get_subface_geometries() : geometry; |
|
|
|
|
|
|
|
stl_vector_mp<const void*> canonical_geometry; |
|
|
|
@ -84,7 +76,8 @@ void primitive::initialize(const stl_vector_mp<internal::paired_model_matrix_ptr |
|
|
|
break; |
|
|
|
} |
|
|
|
case surface_type::sphere: { |
|
|
|
// TODO: 添加 sphere 的处理
|
|
|
|
// Sphere 不依赖任何外部 geometry descriptor,
|
|
|
|
// 其形状完全由 paired_model_matrix 编码,canonical_ptr 保持 nullptr。
|
|
|
|
break; |
|
|
|
} |
|
|
|
case surface_type::extrude_polyline_side: { |
|
|
|
@ -113,7 +106,6 @@ void primitive::destroy() |
|
|
|
auto subface_types = get_subface_types(); |
|
|
|
assert(subfaces.front().get_ptr() != nullptr); |
|
|
|
|
|
|
|
// for (size_t i = 0; i < subfaces.size(); ++i) data_center->release_surface(subface_types[i], subfaces[i]);
|
|
|
|
for (size_t i = 0; i < subfaces.size(); ++i) { |
|
|
|
auto get_geom_func = internal::get_geometry_accessor_ptr(subface_types[i]); |
|
|
|
const void* geometry_ptr = get_geom_func(make_pointer_wrapper(subfaces[i].get_ptr())); |
|
|
|
@ -133,6 +125,7 @@ void primitive::destroy() |
|
|
|
break; |
|
|
|
} |
|
|
|
case surface_type::sphere: { |
|
|
|
// Sphere 没有 descriptor,geometry_ptr 始终为 nullptr,此分支不会执行。
|
|
|
|
break; |
|
|
|
} |
|
|
|
case surface_type::extrude_polyline_side: { |
|
|
|
@ -165,7 +158,8 @@ void primitive::apply_transform(internal::transform_type type, Eigen::Vector4d p |
|
|
|
geometry_ptrs.reserve(subfaces.size()); |
|
|
|
|
|
|
|
for (size_t i = 0; i < subfaces.size(); ++i) { |
|
|
|
if (subface_types[i] == surface_type::plane) { |
|
|
|
// Plane and sphere both carry no descriptor: geometry pointer is always nullptr.
|
|
|
|
if (subface_types[i] == surface_type::plane || subface_types[i] == surface_type::sphere) { |
|
|
|
geometry_ptrs.push_back(nullptr); |
|
|
|
} else { |
|
|
|
auto get_geom_func = internal::get_geometry_accessor_ptr(subface_types[i]); |
|
|
|
@ -204,8 +198,6 @@ void primitive::apply_transform(internal::transform_type type, Eigen::Vector4d p |
|
|
|
} break; |
|
|
|
default: throw std::invalid_argument("Invalid transform type"); |
|
|
|
} |
|
|
|
// apply affine transform to aabb
|
|
|
|
// m_aabb = m_aabb.transformed(affine);
|
|
|
|
|
|
|
|
stl_vector_mp<size_t> saved_marks; |
|
|
|
saved_marks.reserve(subfaces.size()); |
|
|
|
@ -219,29 +211,6 @@ void primitive::apply_transform(internal::transform_type type, Eigen::Vector4d p |
|
|
|
recompute_aabb(); |
|
|
|
} |
|
|
|
|
|
|
|
// 后续可能需要删除这个函数
|
|
|
|
aabb_t compute_local_aabb_from_descriptor(surface_type type, const void* descriptor_ptr) |
|
|
|
{ |
|
|
|
switch (type) { |
|
|
|
case surface_type::cylinder: { |
|
|
|
auto* desc = static_cast<const cylinder_descriptor_t*>(descriptor_ptr); |
|
|
|
double r = desc->radius; |
|
|
|
double h = std::sqrt(desc->offset.x * desc->offset.x + |
|
|
|
desc->offset.y * desc->offset.y + |
|
|
|
desc->offset.z * desc->offset.z); |
|
|
|
return aabb_t(Eigen::Vector3d(-r, -r, 0), Eigen::Vector3d(r, r, h)); |
|
|
|
} |
|
|
|
case surface_type::sphere: { |
|
|
|
// return aabb_t();
|
|
|
|
return aabb_t(Eigen::Vector3d(-1, -1, -1), Eigen::Vector3d(2, 2, 2)); |
|
|
|
} |
|
|
|
case surface_type::plane: return aabb_t(); |
|
|
|
case surface_type::extrude_polyline_side: |
|
|
|
case surface_type::extrude_helixline_side: |
|
|
|
default: std::cerr << "[WARNING] Unknown surface type: " << static_cast<int>(type) << "\n"; return aabb_t(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 重新计算 Primitive 的 AABB
|
|
|
|
void primitive::recompute_aabb() |
|
|
|
{ |
|
|
|
@ -255,18 +224,36 @@ void primitive::recompute_aabb() |
|
|
|
for (size_t i = 0; i < subfaces.size(); ++i) { |
|
|
|
aabb_t local_aabb = aabb_t(); |
|
|
|
if (subface_types[i] == surface_type::extrude_polyline_side) { |
|
|
|
// Extrude faces own their own AABB computation.
|
|
|
|
auto* face = static_cast<internal::extrude_polyline_side_face_t*>(subfaces[i].get_ptr()); |
|
|
|
local_aabb.extend(face->get_aabb()); // 通过访问器读取
|
|
|
|
} else if (subface_types[i] == surface_type::extrude_helixline_side) { |
|
|
|
auto* face = static_cast<internal::extrude_helixline_side_face_t*>(subfaces[i].get_ptr()); |
|
|
|
local_aabb.extend(face->get_aabb()); |
|
|
|
} else { |
|
|
|
const void* descriptor_ptr = nullptr; |
|
|
|
if (subface_types[i] != surface_type::plane && subfaces[i].get_ptr() != nullptr) { |
|
|
|
auto get_desc_func = internal::get_geometry_accessor_ptr(subface_types[i]); |
|
|
|
descriptor_ptr = get_desc_func(make_pointer_wrapper(subfaces[i].get_ptr())); |
|
|
|
switch (subface_types[i]) { |
|
|
|
case surface_type::sphere: { |
|
|
|
constexpr double aabb_epsilon = 1e-9; |
|
|
|
local_aabb = aabb_t(internal::k_aabb_unit.min().array() - aabb_epsilon, |
|
|
|
internal::k_aabb_unit.max().array() + aabb_epsilon); |
|
|
|
break; |
|
|
|
} |
|
|
|
case surface_type::cylinder: { |
|
|
|
if (subfaces[i].get_ptr() != nullptr) { |
|
|
|
auto get_geom_func = internal::get_geometry_accessor_ptr(surface_type::cylinder); |
|
|
|
const void* geom_raw = get_geom_func(make_pointer_wrapper(subfaces[i].get_ptr())); |
|
|
|
const auto* desc = static_cast<const cylinder_descriptor_t*>(geom_raw); |
|
|
|
if (desc) { |
|
|
|
const double r = desc->radius; |
|
|
|
const double h = desc->height; // use the explicit height field, not offset magnitude
|
|
|
|
local_aabb = aabb_t(Eigen::Vector3d(-r, -r, 0.0), Eigen::Vector3d(r, r, h)); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
case surface_type::plane: |
|
|
|
default: continue; |
|
|
|
} |
|
|
|
local_aabb = compute_local_aabb_from_descriptor(subface_types[i], descriptor_ptr); |
|
|
|
|
|
|
|
if (local_aabb.isEmpty()) { continue; } |
|
|
|
if (!local_aabb.min().allFinite() || !local_aabb.max().allFinite()) { |
|
|
|
@ -325,19 +312,17 @@ void primitive::update_geometry(const void* new_geometry_ptr, size_t subface_ind |
|
|
|
switch (subface_types[i]) { |
|
|
|
case surface_type::plane: { |
|
|
|
canonical_ptr = data_center->acquire_plane_geometry(new_geometry_ptr); |
|
|
|
break; |
|
|
|
} |
|
|
|
case surface_type::cylinder: { |
|
|
|
// auto* desc = static_cast<const cylinder_descriptor_t*>(new_descriptor_ptr);
|
|
|
|
canonical_ptr = data_center->acquire_cylinder_geometry(new_geometry_ptr); |
|
|
|
break; |
|
|
|
} |
|
|
|
case surface_type::extrude_polyline_side: { |
|
|
|
// const auto* raw = static_cast<const extrude_polyline_descriptor_t*>(new_descriptor_ptr);
|
|
|
|
canonical_ptr = data_center->acquire_extrude_polyline_geometry(new_geometry_ptr); |
|
|
|
break; |
|
|
|
} |
|
|
|
case surface_type::extrude_helixline_side: { |
|
|
|
// const auto* raw = static_cast<const extrude_helixline_descriptor_t*>(new_descriptor_ptr);
|
|
|
|
canonical_ptr = data_center->acquire_extrude_helixline_geometry(new_geometry_ptr); |
|
|
|
break; |
|
|
|
} |
|
|
|
@ -346,7 +331,8 @@ void primitive::update_geometry(const void* new_geometry_ptr, size_t subface_ind |
|
|
|
new_geometry.push_back(canonical_ptr); |
|
|
|
} else { |
|
|
|
// 保持原有 descriptor
|
|
|
|
if (subface_types[i] == surface_type::plane) { |
|
|
|
if (subface_types[i] == surface_type::plane || subface_types[i] == surface_type::sphere) { |
|
|
|
// Plane and sphere carry no descriptor.
|
|
|
|
new_geometry.push_back(nullptr); |
|
|
|
} else { |
|
|
|
auto get_desc_func = internal::get_geometry_accessor_ptr(subface_types[i]); |
|
|
|
@ -385,7 +371,7 @@ void primitive::update_geometry(const void* new_geometry_ptr, size_t subface_ind |
|
|
|
current_matrices[subface_index], |
|
|
|
new_geometry[subface_index], |
|
|
|
subfaces[subface_index]); |
|
|
|
subfaces[subface_index].set_mark(saved_mark); |
|
|
|
subfaces[subface_index].set_mark(saved_mark); |
|
|
|
// 重新计算 AABB
|
|
|
|
recompute_aabb(); |
|
|
|
} |