1
+ #include " helpers/testPointCloud.hpp"
2
+ #include " helpers/commonHelpers.hpp"
3
+ #include " RGLFields.hpp"
4
+ #include " helpers/sceneHelpers.hpp"
5
+ #include " helpers/lidarHelpers.hpp"
6
+
7
+ class MaskRaysTest : public RGLTest
8
+ {
9
+
10
+ protected:
11
+ const int maskCount = 100 ;
12
+ std::vector<int8_t > points_mask;
13
+ std::vector<rgl_field_t > fields = {XYZ_VEC3_F32, IS_HIT_I32, INTENSITY_F32, IS_GROUND_I32};
14
+
15
+ void initializeMask (int raysCount)
16
+ {
17
+ points_mask.resize (raysCount);
18
+ std::fill (points_mask.begin (), points_mask.end (), 1 );
19
+ for (int i = 0 ; i < maskCount; i++) {
20
+ points_mask[i] = 0 ;
21
+ }
22
+ }
23
+ };
24
+
25
+ TEST_F (MaskRaysTest, invalid_argument_node) { EXPECT_RGL_INVALID_ARGUMENT (rgl_node_raytrace_configure_mask (nullptr , nullptr , 0 )); }
26
+
27
+ TEST_F (MaskRaysTest, invalid_argument_mask)
28
+ {
29
+ rgl_node_t raytraceNode = nullptr ;
30
+ EXPECT_RGL_SUCCESS (rgl_node_raytrace (&raytraceNode, nullptr ));
31
+
32
+ EXPECT_RGL_INVALID_ARGUMENT (rgl_node_raytrace_configure_mask (raytraceNode, nullptr , 0 ));
33
+ }
34
+
35
+ TEST_F (MaskRaysTest, invalid_argument_count)
36
+ {
37
+ rgl_node_t raytraceNode = nullptr ;
38
+ EXPECT_RGL_SUCCESS (rgl_node_raytrace (&raytraceNode, nullptr ));
39
+
40
+ EXPECT_RGL_INVALID_ARGUMENT (rgl_node_raytrace_configure_mask (raytraceNode, points_mask.data (), 0 ));
41
+ }
42
+
43
+ TEST_F (MaskRaysTest, valid_arguments)
44
+ {
45
+ const int raysNumber = 100 ;
46
+ rgl_node_t raytraceNode = nullptr ;
47
+ EXPECT_RGL_SUCCESS (rgl_node_raytrace (&raytraceNode, nullptr ));
48
+
49
+ // Mask
50
+ initializeMask (raysNumber);
51
+
52
+ EXPECT_RGL_SUCCESS (rgl_node_raytrace_configure_mask (raytraceNode, points_mask.data (), raysNumber));
53
+ }
54
+
55
+ TEST_F (MaskRaysTest, use_case)
56
+ {
57
+ // Scene
58
+ rgl_entity_t wall = makeEntity (makeCubeMesh ());
59
+ rgl_mat3x4f wallPose = Mat3x4f::TRS (Vec3f (0 ,0 ,0 ), Vec3f (0 , 0 , 0 ), Vec3f (10 ,10 ,10 )).toRGL ();
60
+ EXPECT_RGL_SUCCESS (rgl_entity_set_pose (wall, &wallPose));
61
+
62
+ // Rays
63
+ std::vector<rgl_mat3x4f> rays = makeLidar3dRays (360 , 180 , 0.36 , 0.18 );
64
+
65
+ const int raysNumber = rays.size ();
66
+ // Mask
67
+ initializeMask (raysNumber);
68
+
69
+ // Graph
70
+ rgl_node_t useRaysNode = nullptr ;
71
+ rgl_node_t raytraceNode = nullptr ;
72
+ rgl_node_t compactNode = nullptr ;
73
+ rgl_node_t yieldNode = nullptr ;
74
+
75
+ // Prepare graph without filtering
76
+ EXPECT_RGL_SUCCESS (rgl_node_rays_from_mat3x4f (&useRaysNode, rays.data (), rays.size ()));
77
+ EXPECT_RGL_SUCCESS (rgl_node_raytrace (&raytraceNode, nullptr ));
78
+ EXPECT_RGL_SUCCESS (rgl_node_points_compact_by_field (&compactNode, IS_HIT_I32));
79
+ EXPECT_RGL_SUCCESS (rgl_node_points_yield (&yieldNode, fields.data (), fields.size ()));
80
+
81
+ EXPECT_RGL_SUCCESS (rgl_graph_node_add_child (useRaysNode, raytraceNode));
82
+ EXPECT_RGL_SUCCESS (rgl_graph_node_add_child (raytraceNode, compactNode));
83
+ EXPECT_RGL_SUCCESS (rgl_graph_node_add_child (compactNode, yieldNode));
84
+
85
+ EXPECT_RGL_SUCCESS (rgl_graph_run (raytraceNode));
86
+
87
+ TestPointCloud outputPointCloud = TestPointCloud::createFromNode (yieldNode, fields);
88
+ auto fullCloudSize = outputPointCloud.getPointCount ();
89
+
90
+ EXPECT_RGL_SUCCESS (rgl_node_raytrace_configure_mask (raytraceNode, points_mask.data (), raysNumber));
91
+
92
+ EXPECT_RGL_SUCCESS (rgl_graph_run (raytraceNode));
93
+ TestPointCloud outputPointCloudMasked = TestPointCloud::createFromNode (yieldNode, fields);
94
+ auto maskedCloudSize = outputPointCloudMasked.getPointCount ();
95
+
96
+ EXPECT_EQ (fullCloudSize - maskCount, maskedCloudSize);
97
+
98
+ }
0 commit comments