Skip to content

Commit 491e272

Browse files
committed
clarify pointcloud message type
Signed-off-by: Taekjin LEE <taekjin.lee@tier4.jp>
1 parent 4da43c1 commit 491e272

File tree

10 files changed

+63
-63
lines changed

10 files changed

+63
-63
lines changed

perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/fusion_node.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ using autoware_perception_msgs::msg::DetectedObject;
5252
using autoware_perception_msgs::msg::DetectedObjects;
5353
using sensor_msgs::msg::CameraInfo;
5454
using sensor_msgs::msg::Image;
55-
using sensor_msgs::msg::PointCloud2;
55+
using PointCloudMsgType = sensor_msgs::msg::PointCloud2;
5656
using RoiMsgType = tier4_perception_msgs::msg::DetectedObjectsWithFeature;
5757
using ClusterMsgType = tier4_perception_msgs::msg::DetectedObjectsWithFeature;
5858
using ClusterObjType = tier4_perception_msgs::msg::DetectedObjectWithFeature;

perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/node.hpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,19 @@ inline bool isInsideBbox(
4141
proj_y >= roi.y_offset * zc && proj_y <= (roi.y_offset + roi.height) * zc;
4242
}
4343

44-
class PointPaintingFusionNode
45-
: public FusionNode<sensor_msgs::msg::PointCloud2, RoiMsgType, DetectedObjects>
44+
class PointPaintingFusionNode : public FusionNode<PointCloudMsgType, RoiMsgType, DetectedObjects>
4645
{
4746
public:
4847
explicit PointPaintingFusionNode(const rclcpp::NodeOptions & options);
4948

5049
protected:
51-
void preprocess(sensor_msgs::msg::PointCloud2 & pointcloud_msg) override;
50+
void preprocess(PointCloudMsgType & pointcloud_msg) override;
5251

5352
void fuseOnSingleImage(
54-
const sensor_msgs::msg::PointCloud2 & input_pointcloud_msg,
55-
const Det2dManager<RoiMsgType> & det2d, const RoiMsgType & input_roi_msg,
56-
sensor_msgs::msg::PointCloud2 & painted_pointcloud_msg) override;
53+
const PointCloudMsgType & input_pointcloud_msg, const Det2dManager<RoiMsgType> & det2d,
54+
const RoiMsgType & input_roi_msg, PointCloudMsgType & painted_pointcloud_msg) override;
5755

58-
void postprocess(sensor_msgs::msg::PointCloud2 & painted_pointcloud_msg) override;
56+
void postprocess(PointCloudMsgType & painted_pointcloud_msg) override;
5957

6058
rclcpp::Publisher<DetectedObjects>::SharedPtr obj_pub_ptr_;
6159

perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_pointcloud_fusion/node.hpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
namespace autoware::image_projection_based_fusion
2727
{
28-
class RoiPointCloudFusionNode : public FusionNode<PointCloud2, RoiMsgType, ClusterObjType>
28+
class RoiPointCloudFusionNode : public FusionNode<PointCloudMsgType, RoiMsgType, ClusterObjType>
2929
{
3030
private:
3131
int min_cluster_size_{1};
@@ -35,20 +35,20 @@ class RoiPointCloudFusionNode : public FusionNode<PointCloud2, RoiMsgType, Clust
3535

3636
rclcpp::Publisher<ClusterMsgType>::SharedPtr pub_objects_ptr_;
3737
std::vector<ClusterObjType> output_fused_objects_;
38-
rclcpp::Publisher<sensor_msgs::msg::PointCloud2>::SharedPtr cluster_debug_pub_;
38+
rclcpp::Publisher<PointCloudMsgType>::SharedPtr cluster_debug_pub_;
3939

4040
/* data */
4141
public:
4242
explicit RoiPointCloudFusionNode(const rclcpp::NodeOptions & options);
4343

4444
protected:
45-
void preprocess(sensor_msgs::msg::PointCloud2 & pointcloud_msg) override;
45+
void preprocess(PointCloudMsgType & pointcloud_msg) override;
4646

47-
void postprocess(sensor_msgs::msg::PointCloud2 & pointcloud_msg) override;
47+
void postprocess(PointCloudMsgType & pointcloud_msg) override;
4848

4949
void fuseOnSingleImage(
50-
const PointCloud2 & input_pointcloud_msg, const Det2dManager<RoiMsgType> & det2d,
51-
const RoiMsgType & input_roi_msg, PointCloud2 & output_pointcloud_msg) override;
50+
const PointCloudMsgType & input_pointcloud_msg, const Det2dManager<RoiMsgType> & det2d,
51+
const RoiMsgType & input_roi_msg, PointCloudMsgType & output_pointcloud_msg) override;
5252
bool out_of_scope(const ClusterObjType & obj) override;
5353
};
5454

perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/segmentation_pointcloud_fusion/node.hpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@
3434

3535
namespace autoware::image_projection_based_fusion
3636
{
37-
class SegmentPointCloudFusionNode : public FusionNode<PointCloud2, Image, PointCloud2>
37+
class SegmentPointCloudFusionNode : public FusionNode<PointCloudMsgType, Image, PointCloudMsgType>
3838
{
3939
private:
40-
rclcpp::Publisher<PointCloud2>::SharedPtr pub_pointcloud_ptr_;
40+
rclcpp::Publisher<PointCloudMsgType>::SharedPtr pub_pointcloud_ptr_;
4141
std::vector<bool> filter_semantic_label_target_;
4242
float filter_distance_threshold_;
4343
// declare list of semantic label target, depend on trained data of yolox segmentation model
@@ -55,18 +55,18 @@ class SegmentPointCloudFusionNode : public FusionNode<PointCloud2, Image, PointC
5555
explicit SegmentPointCloudFusionNode(const rclcpp::NodeOptions & options);
5656

5757
protected:
58-
void preprocess(PointCloud2 & pointcloud_msg) override;
58+
void preprocess(PointCloudMsgType & pointcloud_msg) override;
5959

60-
void postprocess(PointCloud2 & pointcloud_msg) override;
60+
void postprocess(PointCloudMsgType & pointcloud_msg) override;
6161

6262
void fuseOnSingleImage(
63-
const PointCloud2 & input_pointcloud_msg, const Det2dManager<Image> & det2d,
64-
const Image & input_mask, PointCloud2 & output_pointcloud_msg) override;
63+
const PointCloudMsgType & input_pointcloud_msg, const Det2dManager<Image> & det2d,
64+
const Image & input_mask, PointCloudMsgType & output_pointcloud_msg) override;
6565

66-
bool out_of_scope(const PointCloud2 & filtered_cloud) override;
66+
bool out_of_scope(const PointCloudMsgType & filtered_cloud) override;
6767
inline void copyPointCloud(
68-
const PointCloud2 & input, const int point_step, const size_t global_offset,
69-
PointCloud2 & output, size_t & output_pointcloud_size)
68+
const PointCloudMsgType & input, const int point_step, const size_t global_offset,
69+
PointCloudMsgType & output, size_t & output_pointcloud_size)
7070
{
7171
std::memcpy(&output.data[output_pointcloud_size], &input.data[global_offset], point_step);
7272
output_pointcloud_size += point_step;

perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/utils/utils.hpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ namespace autoware::image_projection_based_fusion
5656
{
5757

5858
using PointCloud = pcl::PointCloud<pcl::PointXYZ>;
59-
using PointCloud2 = sensor_msgs::msg::PointCloud2;
59+
6060
struct PointData
6161
{
6262
float distance;
@@ -72,17 +72,17 @@ std::optional<geometry_msgs::msg::TransformStamped> getTransformStamped(
7272
Eigen::Affine3d transformToEigen(const geometry_msgs::msg::Transform & t);
7373

7474
void closest_cluster(
75-
const PointCloud2 & cluster, const double cluster_2d_tolerance, const int min_cluster_size,
76-
const pcl::PointXYZ & center, PointCloud2 & out_cluster);
75+
const PointCloudMsgType & cluster, const double cluster_2d_tolerance, const int min_cluster_size,
76+
const pcl::PointXYZ & center, PointCloudMsgType & out_cluster);
7777

7878
void updateOutputFusedObjects(
79-
std::vector<DetectedObjectWithFeature> & output_objs, std::vector<PointCloud2> & clusters,
80-
const std::vector<size_t> & clusters_data_size, const PointCloud2 & in_cloud,
79+
std::vector<DetectedObjectWithFeature> & output_objs, std::vector<PointCloudMsgType> & clusters,
80+
const std::vector<size_t> & clusters_data_size, const PointCloudMsgType & in_cloud,
8181
const std_msgs::msg::Header & in_roi_header, const tf2_ros::Buffer & tf_buffer,
8282
const int min_cluster_size, const int max_cluster_size, const float cluster_2d_tolerance,
8383
std::vector<DetectedObjectWithFeature> & output_fused_objects);
8484

85-
geometry_msgs::msg::Point getCentroid(const sensor_msgs::msg::PointCloud2 & pointcloud);
85+
geometry_msgs::msg::Point getCentroid(const PointCloudMsgType & pointcloud);
8686

8787
} // namespace autoware::image_projection_based_fusion
8888

perception/autoware_image_projection_based_fusion/src/fusion_node.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ void FusionNode<Msg3D, Msg2D, ExportObj>::publish(const Msg3D & output_msg)
494494
// Explicit instantiation for the supported types
495495

496496
// pointpainting fusion
497-
template class FusionNode<PointCloud2, RoiMsgType, DetectedObjects>;
497+
template class FusionNode<PointCloudMsgType, RoiMsgType, DetectedObjects>;
498498

499499
// roi cluster fusion
500500
template class FusionNode<ClusterMsgType, RoiMsgType, ClusterObjType>;
@@ -503,9 +503,9 @@ template class FusionNode<ClusterMsgType, RoiMsgType, ClusterObjType>;
503503
template class FusionNode<DetectedObjects, RoiMsgType, DetectedObject>;
504504

505505
// roi pointcloud fusion
506-
template class FusionNode<PointCloud2, RoiMsgType, ClusterObjType>;
506+
template class FusionNode<PointCloudMsgType, RoiMsgType, ClusterObjType>;
507507

508508
// segment pointcloud fusion
509-
template class FusionNode<PointCloud2, Image, PointCloud2>;
509+
template class FusionNode<PointCloudMsgType, Image, PointCloudMsgType>;
510510

511511
} // namespace autoware::image_projection_based_fusion

perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ inline bool isUnknown(int label2d)
9191
}
9292

9393
PointPaintingFusionNode::PointPaintingFusionNode(const rclcpp::NodeOptions & options)
94-
: FusionNode<PointCloud2, RoiMsgType, DetectedObjects>("pointpainting_fusion", options)
94+
: FusionNode<PointCloudMsgType, RoiMsgType, DetectedObjects>("pointpainting_fusion", options)
9595
{
9696
omp_num_threads_ = this->declare_parameter<int>("omp_params.num_threads");
9797
const float score_threshold =
@@ -194,7 +194,7 @@ PointPaintingFusionNode::PointPaintingFusionNode(const rclcpp::NodeOptions & opt
194194
}
195195
}
196196

197-
void PointPaintingFusionNode::preprocess(PointCloud2 & painted_pointcloud_msg)
197+
void PointPaintingFusionNode::preprocess(PointCloudMsgType & painted_pointcloud_msg)
198198
{
199199
std::unique_ptr<ScopedTimeTrack> st_ptr;
200200
if (time_keeper_) st_ptr = std::make_unique<ScopedTimeTrack>(__func__, *time_keeper_);
@@ -251,9 +251,9 @@ void PointPaintingFusionNode::preprocess(PointCloud2 & painted_pointcloud_msg)
251251
}
252252

253253
void PointPaintingFusionNode::fuseOnSingleImage(
254-
__attribute__((unused)) const PointCloud2 & input_pointcloud_msg,
254+
__attribute__((unused)) const PointCloudMsgType & input_pointcloud_msg,
255255
const Det2dManager<RoiMsgType> & det2d, const RoiMsgType & input_roi_msg,
256-
PointCloud2 & painted_pointcloud_msg)
256+
PointCloudMsgType & painted_pointcloud_msg)
257257
{
258258
if (painted_pointcloud_msg.data.empty() || painted_pointcloud_msg.fields.empty()) {
259259
RCLCPP_WARN_STREAM_THROTTLE(
@@ -378,7 +378,7 @@ dc | dc dc dc dc ||zc|
378378
}
379379
}
380380

381-
void PointPaintingFusionNode::postprocess(PointCloud2 & painted_pointcloud_msg)
381+
void PointPaintingFusionNode::postprocess(PointCloudMsgType & painted_pointcloud_msg)
382382
{
383383
std::unique_ptr<ScopedTimeTrack> st_ptr;
384384
if (time_keeper_) st_ptr = std::make_unique<ScopedTimeTrack>(__func__, *time_keeper_);

perception/autoware_image_projection_based_fusion/src/roi_pointcloud_fusion/node.cpp

+12-12
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,27 @@ namespace autoware::image_projection_based_fusion
3737
using autoware::universe_utils::ScopedTimeTrack;
3838

3939
RoiPointCloudFusionNode::RoiPointCloudFusionNode(const rclcpp::NodeOptions & options)
40-
: FusionNode<PointCloud2, RoiMsgType, DetectedObjectWithFeature>("roi_pointcloud_fusion", options)
40+
: FusionNode<PointCloudMsgType, RoiMsgType, DetectedObjectWithFeature>(
41+
"roi_pointcloud_fusion", options)
4142
{
4243
fuse_unknown_only_ = declare_parameter<bool>("fuse_unknown_only");
4344
min_cluster_size_ = declare_parameter<int>("min_cluster_size");
4445
max_cluster_size_ = declare_parameter<int>("max_cluster_size");
4546
cluster_2d_tolerance_ = declare_parameter<double>("cluster_2d_tolerance");
4647
pub_objects_ptr_ = this->create_publisher<ClusterMsgType>("output_clusters", rclcpp::QoS{1});
47-
cluster_debug_pub_ = this->create_publisher<sensor_msgs::msg::PointCloud2>("debug/clusters", 1);
48+
cluster_debug_pub_ = this->create_publisher<PointCloudMsgType>("debug/clusters", 1);
4849
}
4950

50-
void RoiPointCloudFusionNode::preprocess(
51-
__attribute__((unused)) sensor_msgs::msg::PointCloud2 & pointcloud_msg)
51+
void RoiPointCloudFusionNode::preprocess(__attribute__((unused)) PointCloudMsgType & pointcloud_msg)
5252
{
5353
std::unique_ptr<ScopedTimeTrack> st_ptr;
5454
if (time_keeper_) st_ptr = std::make_unique<ScopedTimeTrack>(__func__, *time_keeper_);
5555

5656
return;
5757
}
5858

59-
void RoiPointCloudFusionNode::postprocess(
60-
__attribute__((unused)) sensor_msgs::msg::PointCloud2 & pointcloud_msg)
59+
void RoiPointCloudFusionNode::postprocess(__attribute__((unused))
60+
PointCloudMsgType & pointcloud_msg)
6161
{
6262
std::unique_ptr<ScopedTimeTrack> st_ptr;
6363
if (time_keeper_) st_ptr = std::make_unique<ScopedTimeTrack>(__func__, *time_keeper_);
@@ -78,15 +78,15 @@ void RoiPointCloudFusionNode::postprocess(
7878
output_fused_objects_.clear();
7979
// publish debug cluster
8080
if (cluster_debug_pub_->get_subscription_count() > 0) {
81-
sensor_msgs::msg::PointCloud2 debug_cluster_msg;
81+
PointCloudMsgType debug_cluster_msg;
8282
autoware::euclidean_cluster::convertObjectMsg2SensorMsg(output_msg, debug_cluster_msg);
8383
cluster_debug_pub_->publish(debug_cluster_msg);
8484
}
8585
}
8686
void RoiPointCloudFusionNode::fuseOnSingleImage(
87-
const sensor_msgs::msg::PointCloud2 & input_pointcloud_msg,
88-
const Det2dManager<RoiMsgType> & det2d, const RoiMsgType & input_roi_msg,
89-
__attribute__((unused)) sensor_msgs::msg::PointCloud2 & output_pointcloud_msg)
87+
const PointCloudMsgType & input_pointcloud_msg, const Det2dManager<RoiMsgType> & det2d,
88+
const RoiMsgType & input_roi_msg,
89+
__attribute__((unused)) PointCloudMsgType & output_pointcloud_msg)
9090
{
9191
std::unique_ptr<ScopedTimeTrack> st_ptr;
9292
if (time_keeper_) st_ptr = std::make_unique<ScopedTimeTrack>(__func__, *time_keeper_);
@@ -135,10 +135,10 @@ void RoiPointCloudFusionNode::fuseOnSingleImage(
135135
const int z_offset =
136136
input_pointcloud_msg.fields[pcl::getFieldIndex(input_pointcloud_msg, "z")].offset;
137137

138-
sensor_msgs::msg::PointCloud2 transformed_cloud;
138+
PointCloudMsgType transformed_cloud;
139139
tf2::doTransform(input_pointcloud_msg, transformed_cloud, transform_stamped);
140140

141-
std::vector<sensor_msgs::msg::PointCloud2> clusters;
141+
std::vector<PointCloudMsgType> clusters;
142142
std::vector<size_t> clusters_data_size;
143143
clusters.resize(output_objs.size());
144144
for (auto & cluster : clusters) {

perception/autoware_image_projection_based_fusion/src/segmentation_pointcloud_fusion/node.cpp

+10-8
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ namespace autoware::image_projection_based_fusion
3636
using autoware::universe_utils::ScopedTimeTrack;
3737

3838
SegmentPointCloudFusionNode::SegmentPointCloudFusionNode(const rclcpp::NodeOptions & options)
39-
: FusionNode<PointCloud2, Image, PointCloud2>("segmentation_pointcloud_fusion", options)
39+
: FusionNode<PointCloudMsgType, Image, PointCloudMsgType>("segmentation_pointcloud_fusion", options)
4040
{
4141
filter_distance_threshold_ = declare_parameter<float>("filter_distance_threshold");
4242
for (auto & item : filter_semantic_label_target_list_) {
@@ -50,20 +50,21 @@ SegmentPointCloudFusionNode::SegmentPointCloudFusionNode(const rclcpp::NodeOptio
5050
pub_debug_mask_ptr_ = image_transport::create_publisher(this, "~/debug/mask");
5151
}
5252

53-
void SegmentPointCloudFusionNode::preprocess(__attribute__((unused)) PointCloud2 & pointcloud_msg)
53+
void SegmentPointCloudFusionNode::preprocess(__attribute__((unused))
54+
PointCloudMsgType & pointcloud_msg)
5455
{
5556
std::unique_ptr<ScopedTimeTrack> st_ptr;
5657
if (time_keeper_) st_ptr = std::make_unique<ScopedTimeTrack>(__func__, *time_keeper_);
5758

5859
return;
5960
}
6061

61-
void SegmentPointCloudFusionNode::postprocess(PointCloud2 & pointcloud_msg)
62+
void SegmentPointCloudFusionNode::postprocess(PointCloudMsgType & pointcloud_msg)
6263
{
6364
std::unique_ptr<ScopedTimeTrack> st_ptr;
6465
if (time_keeper_) st_ptr = std::make_unique<ScopedTimeTrack>(__func__, *time_keeper_);
6566

66-
auto original_cloud = std::make_shared<PointCloud2>(pointcloud_msg);
67+
auto original_cloud = std::make_shared<PointCloudMsgType>(pointcloud_msg);
6768

6869
int point_step = original_cloud->point_step;
6970
size_t output_pointcloud_size = 0;
@@ -87,8 +88,9 @@ void SegmentPointCloudFusionNode::postprocess(PointCloud2 & pointcloud_msg)
8788
}
8889

8990
void SegmentPointCloudFusionNode::fuseOnSingleImage(
90-
const PointCloud2 & input_pointcloud_msg, const Det2dManager<Image> & det2d,
91-
[[maybe_unused]] const Image & input_mask, __attribute__((unused)) PointCloud2 & output_cloud)
91+
const PointCloudMsgType & input_pointcloud_msg, const Det2dManager<Image> & det2d,
92+
[[maybe_unused]] const Image & input_mask,
93+
__attribute__((unused)) PointCloudMsgType & output_cloud)
9294
{
9395
std::unique_ptr<ScopedTimeTrack> st_ptr;
9496
if (time_keeper_) st_ptr = std::make_unique<ScopedTimeTrack>(__func__, *time_keeper_);
@@ -128,7 +130,7 @@ void SegmentPointCloudFusionNode::fuseOnSingleImage(
128130
transform_stamped = transform_stamped_optional.value();
129131
}
130132

131-
PointCloud2 transformed_cloud;
133+
PointCloudMsgType transformed_cloud;
132134
tf2::doTransform(input_pointcloud_msg, transformed_cloud, transform_stamped);
133135

134136
int point_step = input_pointcloud_msg.point_step;
@@ -169,7 +171,7 @@ void SegmentPointCloudFusionNode::fuseOnSingleImage(
169171
}
170172

171173
bool SegmentPointCloudFusionNode::out_of_scope(__attribute__((unused))
172-
const PointCloud2 & filtered_cloud)
174+
const PointCloudMsgType & filtered_cloud)
173175
{
174176
return false;
175177
}

perception/autoware_image_projection_based_fusion/src/utils/utils.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ Eigen::Affine3d transformToEigen(const geometry_msgs::msg::Transform & t)
6767
}
6868

6969
void closest_cluster(
70-
const PointCloud2 & cluster, const double cluster_2d_tolerance, const int min_cluster_size,
71-
const pcl::PointXYZ & center, PointCloud2 & out_cluster)
70+
const PointCloudMsgType & cluster, const double cluster_2d_tolerance, const int min_cluster_size,
71+
const pcl::PointXYZ & center, PointCloudMsgType & out_cluster)
7272
{
7373
// sort point by distance to camera origin
7474

@@ -123,8 +123,8 @@ void closest_cluster(
123123
}
124124

125125
void updateOutputFusedObjects(
126-
std::vector<DetectedObjectWithFeature> & output_objs, std::vector<PointCloud2> & clusters,
127-
const std::vector<size_t> & clusters_data_size, const PointCloud2 & in_cloud,
126+
std::vector<DetectedObjectWithFeature> & output_objs, std::vector<PointCloudMsgType> & clusters,
127+
const std::vector<size_t> & clusters_data_size, const PointCloudMsgType & in_cloud,
128128
const std_msgs::msg::Header & in_roi_header, const tf2_ros::Buffer & tf_buffer,
129129
const int min_cluster_size, const int max_cluster_size, const float cluster_2d_tolerance,
130130
std::vector<DetectedObjectWithFeature> & output_fused_objects)
@@ -162,7 +162,7 @@ void updateOutputFusedObjects(
162162

163163
// TODO(badai-nguyen): change to interface to select refine criteria like closest, largest
164164
// to output refine cluster and centroid
165-
sensor_msgs::msg::PointCloud2 refine_cluster;
165+
PointCloudMsgType refine_cluster;
166166
closest_cluster(
167167
cluster, cluster_2d_tolerance, min_cluster_size, camera_orig_point_frame, refine_cluster);
168168
if (
@@ -184,7 +184,7 @@ void updateOutputFusedObjects(
184184
}
185185
}
186186

187-
geometry_msgs::msg::Point getCentroid(const sensor_msgs::msg::PointCloud2 & pointcloud)
187+
geometry_msgs::msg::Point getCentroid(const PointCloudMsgType & pointcloud)
188188
{
189189
geometry_msgs::msg::Point centroid;
190190
centroid.x = 0.0f;

0 commit comments

Comments
 (0)