#pragma once #include #include #include namespace internal { struct cylinder_t final : public primitive { cylinder_t(primitive_data_center_t *data_center_ptr) : primitive(data_center_ptr) { initialize({identity_model_matrix_ptr, plane_to_z_model_matrix_ptr, plane_to_z_pos_1_model_matrix_ptr}, {false, true, false}, {static_cast(&descriptor_defaults::unit_cylinder), nullptr, nullptr}, k_aabb_up_unit); } primitive_type get_type() const override { return PRIMITIVE_TYPE_CYLINDER; }; /** * @brief 获取子面的 descriptor 指针 * @return 指针数组,可能是以下两种类型: * - 规范化指针:已被 data_center 管理,共享生命周期 * - 常量池指针:指向全局常量,仅用于初始化时查找 */ stl_vector_mp get_subface_geometries() const override { std::cerr << "[CYLINDER_GEOM] Getting subface geometries:\n"; // 检查是否已初始化 if (subfaces[0].get_ptr() != nullptr) { auto* cylinder_face = static_cast(subfaces[0].get_ptr()); return { static_cast(cylinder_face->get_geometry_ptr()), nullptr, nullptr }; } else { return { static_cast(&descriptor_defaults::unit_cylinder), // 在 cylinder 中,geometry 即 descriptor nullptr, nullptr }; } } span> get_subfaces() const override { return {const_cast *>(subfaces.data()), subfaces.size()}; } stl_vector_mp get_subface_types() const override { return {surface_type::cylinder, surface_type::plane, surface_type::plane}; } std::array, 3> subfaces{}; }; } // namespace internal