// pcl_wrapper/src/wrapper.cpp #include "filter.hpp" #include "point_types.hpp" #include "pcl_wrapper_api.hpp" #include #include using namespace pcl_wrapper; using CloudPtr = pcl::PointCloud::Ptr; class VoxelGridXYZBridge { public: VoxelGridXYZBridge(float leaf) { filter.setLeafSize(leaf); } void setInput(const float* points, int count) { CloudPtr cloud(new pcl::PointCloud()); cloud->resize(count); for (int i = 0; i < count; ++i) { (*cloud)[i].x = points[3 * i]; (*cloud)[i].y = points[3 * i + 1]; (*cloud)[i].z = points[3 * i + 2]; } filter.setInputCloud(cloud); } void getFiltered(float** outPts, int* outCount) { auto cloud = filter.getFilteredCloud(); *outCount = cloud->size(); *outPts = new float[*outCount * 3]; for (int i = 0; i < *outCount; ++i) { (*outPts)[3 * i + 0] = (*cloud)[i].x; (*outPts)[3 * i + 1] = (*cloud)[i].y; (*outPts)[3 * i + 2] = (*cloud)[i].z; } } private: VoxelGridFilterImpl filter; }; extern "C" { void* CreateVoxelGridXYZ(float leaf) { return new VoxelGridXYZBridge(leaf); } void SetInputCloudXYZ(void* obj, const float* points, int count) { static_cast(obj)->setInput(points, count); } void ApplyVoxelGridXYZ(void* obj, float** outPoints, int* outCount) { static_cast(obj)->getFiltered(outPoints, outCount); } void FreeVoxelGridXYZ(void* obj) { delete static_cast(obj); } } // extern C