@@ -34,7 +34,9 @@ class TestLevelSetRayIntersector : public ::testing::Test
34
34
};
35
35
36
36
37
- TEST_F (TestLevelSetRayIntersector, tests)
37
+ template <typename GridT>
38
+ void
39
+ testLevelSetRayIntersectorImpl ()
38
40
{
39
41
using namespace openvdb ;
40
42
typedef math::Ray<double > RayT;
@@ -45,9 +47,9 @@ TEST_F(TestLevelSetRayIntersector, tests)
45
47
const Vec3f c (20 .0f , 0 .0f , 0 .0f );
46
48
const float s = 0 .5f , w = 2 .0f ;
47
49
48
- FloatGrid ::Ptr ls = tools::createLevelSetSphere<FloatGrid >(r, c, s, w);
50
+ typename GridT ::Ptr ls = tools::createLevelSetSphere<GridT >(r, c, s, w);
49
51
50
- tools::LevelSetRayIntersector<FloatGrid > lsri (*ls);
52
+ tools::LevelSetRayIntersector<GridT > lsri (*ls);
51
53
52
54
const Vec3T dir (1.0 , 0.0 , 0.0 );
53
55
const Vec3T eye (2.0 , 0.0 , 0.0 );
@@ -73,9 +75,9 @@ TEST_F(TestLevelSetRayIntersector, tests)
73
75
const Vec3f c (20 .0f , 0 .0f , 0 .0f );
74
76
const float s = 0 .5f , w = 2 .0f ;
75
77
76
- FloatGrid ::Ptr ls = tools::createLevelSetSphere<FloatGrid >(r, c, s, w);
78
+ typename GridT ::Ptr ls = tools::createLevelSetSphere<GridT >(r, c, s, w);
77
79
78
- tools::LevelSetRayIntersector<FloatGrid > lsri (*ls);
80
+ tools::LevelSetRayIntersector<GridT > lsri (*ls);
79
81
80
82
const Vec3T dir (1.0 ,-0.0 ,-0.0 );
81
83
const Vec3T eye (2.0 , 0.0 , 0.0 );
@@ -101,74 +103,79 @@ TEST_F(TestLevelSetRayIntersector, tests)
101
103
const Vec3f c (0 .0f , 20 .0f , 0 .0f );
102
104
const float s = 1 .5f , w = 2 .0f ;
103
105
104
- FloatGrid ::Ptr ls = tools::createLevelSetSphere<FloatGrid >(r, c, s, w);
106
+ typename GridT ::Ptr ls = tools::createLevelSetSphere<GridT >(r, c, s, w);
105
107
106
- tools::LevelSetRayIntersector<FloatGrid > lsri (*ls);
108
+ tools::LevelSetRayIntersector<GridT > lsri (*ls);
107
109
108
110
const Vec3T dir (0.0 , 1.0 , 0.0 );
109
111
const Vec3T eye (0.0 ,-2.0 , 0.0 );
110
112
RayT ray (eye, dir);
111
113
Vec3T xyz (0 );
112
114
Real time = 0 ;
115
+ constexpr double tolerance = std::is_floating_point_v<typename GridT::ValueType> ? 1e-6 : 1e-3 ;
116
+
113
117
EXPECT_TRUE (lsri.intersectsWS (ray, xyz, time));
114
- ASSERT_DOUBLES_APPROX_EQUAL ( 0.0 , xyz[0 ]);
115
- ASSERT_DOUBLES_APPROX_EQUAL (15.0 , xyz[1 ]);
116
- ASSERT_DOUBLES_APPROX_EQUAL ( 0.0 , xyz[2 ]);
117
- ASSERT_DOUBLES_APPROX_EQUAL (17.0 , time);
118
+ EXPECT_NEAR ( 0.0 , xyz[0 ], tolerance );
119
+ EXPECT_NEAR (15.0 , xyz[1 ], tolerance );
120
+ EXPECT_NEAR ( 0.0 , xyz[2 ], tolerance );
121
+ EXPECT_NEAR (17.0 , time, tolerance );
118
122
double t0=0 , t1=0 ;
119
123
EXPECT_TRUE (ray.intersects (c, r, t0, t1));
120
- ASSERT_DOUBLES_APPROX_EQUAL (t0, time);
124
+ EXPECT_NEAR (t0, time, tolerance );
121
125
// std::cerr << "\nray("<<t0<<")="<<ray(t0)<<std::endl;
122
126
// std::cerr << "Intersection at xyz = " << xyz << std::endl;
123
- ASSERT_DOUBLES_APPROX_EQUAL ( 0.0 , ray (t0)[0 ]);
124
- ASSERT_DOUBLES_APPROX_EQUAL (15.0 , ray (t0)[1 ]);
125
- ASSERT_DOUBLES_APPROX_EQUAL ( 0.0 , ray (t0)[2 ]);
127
+ EXPECT_NEAR ( 0.0 , ray (t0)[0 ], tolerance );
128
+ EXPECT_NEAR (15.0 , ray (t0)[1 ], tolerance );
129
+ EXPECT_NEAR ( 0.0 , ray (t0)[2 ], tolerance );
126
130
}
127
131
128
132
{// voxel intersection against a level set sphere
129
133
const float r = 5 .0f ;
130
134
const Vec3f c (0 .0f , 20 .0f , 0 .0f );
131
135
const float s = 1 .5f , w = 2 .0f ;
132
136
133
- FloatGrid ::Ptr ls = tools::createLevelSetSphere<FloatGrid >(r, c, s, w);
137
+ typename GridT ::Ptr ls = tools::createLevelSetSphere<GridT >(r, c, s, w);
134
138
135
- tools::LevelSetRayIntersector<FloatGrid > lsri (*ls);
139
+ tools::LevelSetRayIntersector<GridT > lsri (*ls);
136
140
137
141
const Vec3T dir (-0.0 , 1.0 ,-0.0 );
138
142
const Vec3T eye ( 0.0 ,-2.0 , 0.0 );
139
143
RayT ray (eye, dir);
140
144
Vec3T xyz (0 );
141
145
Real time = 0 ;
146
+ constexpr double tolerance = std::is_floating_point_v<typename GridT::ValueType> ? 1e-6 : 1e-3 ;
147
+
142
148
EXPECT_TRUE (lsri.intersectsWS (ray, xyz, time));
143
- ASSERT_DOUBLES_APPROX_EQUAL ( 0.0 , xyz[0 ]);
144
- ASSERT_DOUBLES_APPROX_EQUAL (15.0 , xyz[1 ]);
145
- ASSERT_DOUBLES_APPROX_EQUAL ( 0.0 , xyz[2 ]);
146
- ASSERT_DOUBLES_APPROX_EQUAL (17.0 , time);
149
+ EXPECT_NEAR ( 0.0 , xyz[0 ], tolerance );
150
+ EXPECT_NEAR (15.0 , xyz[1 ], tolerance );
151
+ EXPECT_NEAR ( 0.0 , xyz[2 ], tolerance );
152
+ EXPECT_NEAR (17.0 , time, tolerance );
147
153
double t0=0 , t1=0 ;
148
154
EXPECT_TRUE (ray.intersects (c, r, t0, t1));
149
- ASSERT_DOUBLES_APPROX_EQUAL (t0, time);
155
+ EXPECT_NEAR (t0, time, tolerance );
150
156
// std::cerr << "\nray("<<t0<<")="<<ray(t0)<<std::endl;
151
157
// std::cerr << "Intersection at xyz = " << xyz << std::endl;
152
- ASSERT_DOUBLES_APPROX_EQUAL ( 0.0 , ray (t0)[0 ]);
153
- ASSERT_DOUBLES_APPROX_EQUAL (15.0 , ray (t0)[1 ]);
154
- ASSERT_DOUBLES_APPROX_EQUAL ( 0.0 , ray (t0)[2 ]);
158
+ EXPECT_NEAR ( 0.0 , ray (t0)[0 ], tolerance );
159
+ EXPECT_NEAR (15.0 , ray (t0)[1 ], tolerance );
160
+ EXPECT_NEAR ( 0.0 , ray (t0)[2 ], tolerance );
155
161
}
156
162
157
163
{// voxel intersection against a level set sphere
158
164
const float r = 5 .0f ;
159
165
const Vec3f c (0 .0f , 0 .0f , 20 .0f );
160
166
const float s = 1 .0f , w = 3 .0f ;
161
167
162
- FloatGrid ::Ptr ls = tools::createLevelSetSphere<FloatGrid >(r, c, s, w);
168
+ typename GridT ::Ptr ls = tools::createLevelSetSphere<GridT >(r, c, s, w);
163
169
164
- typedef tools::LinearSearchImpl<FloatGrid > SearchImplT;
165
- tools::LevelSetRayIntersector<FloatGrid , SearchImplT, -1 > lsri (*ls);
170
+ typedef tools::LinearSearchImpl<GridT > SearchImplT;
171
+ tools::LevelSetRayIntersector<GridT , SearchImplT, -1 > lsri (*ls);
166
172
167
173
const Vec3T dir (0.0 , 0.0 , 1.0 );
168
174
const Vec3T eye (0.0 , 0.0 , 4.0 );
169
175
RayT ray (eye, dir);
170
176
Vec3T xyz (0 );
171
177
Real time = 0 ;
178
+
172
179
EXPECT_TRUE (lsri.intersectsWS (ray, xyz, time));
173
180
ASSERT_DOUBLES_APPROX_EQUAL ( 0.0 , xyz[0 ]);
174
181
ASSERT_DOUBLES_APPROX_EQUAL ( 0.0 , xyz[1 ]);
@@ -189,10 +196,10 @@ TEST_F(TestLevelSetRayIntersector, tests)
189
196
const Vec3f c (0 .0f , 0 .0f , 20 .0f );
190
197
const float s = 1 .0f , w = 3 .0f ;
191
198
192
- FloatGrid ::Ptr ls = tools::createLevelSetSphere<FloatGrid >(r, c, s, w);
199
+ typename GridT ::Ptr ls = tools::createLevelSetSphere<GridT >(r, c, s, w);
193
200
194
- typedef tools::LinearSearchImpl<FloatGrid > SearchImplT;
195
- tools::LevelSetRayIntersector<FloatGrid , SearchImplT, -1 > lsri (*ls);
201
+ typedef tools::LinearSearchImpl<GridT > SearchImplT;
202
+ tools::LevelSetRayIntersector<GridT , SearchImplT, -1 > lsri (*ls);
196
203
197
204
const Vec3T dir (-0.0 ,-0.0 , 1.0 );
198
205
const Vec3T eye ( 0.0 , 0.0 , 4.0 );
@@ -220,10 +227,10 @@ TEST_F(TestLevelSetRayIntersector, tests)
220
227
const Vec3f c (0 .0f , 0 .0f , 20 .0f );
221
228
const float s = 1 .0f , w = 3 .0f ;
222
229
223
- FloatGrid ::Ptr ls = tools::createLevelSetSphere<FloatGrid >(r, c, s, w);
230
+ typename GridT ::Ptr ls = tools::createLevelSetSphere<GridT >(r, c, s, w);
224
231
225
- typedef tools::LinearSearchImpl<FloatGrid > SearchImplT;
226
- tools::LevelSetRayIntersector<FloatGrid , SearchImplT, -1 > lsri (*ls);
232
+ typedef tools::LinearSearchImpl<GridT > SearchImplT;
233
+ tools::LevelSetRayIntersector<GridT , SearchImplT, -1 > lsri (*ls);
227
234
228
235
const Vec3T dir (-0.0 ,-0.0 , 1.0 );
229
236
const Vec3T eye ( 0.0 , 0.0 , 4.0 );
@@ -251,41 +258,43 @@ TEST_F(TestLevelSetRayIntersector, tests)
251
258
const Vec3f c (10 .0f , 10 .0f , 10 .0f );
252
259
const float s = 1 .0f , w = 3 .0f ;
253
260
254
- FloatGrid ::Ptr ls = tools::createLevelSetSphere<FloatGrid >(r, c, s, w);
261
+ typename GridT ::Ptr ls = tools::createLevelSetSphere<GridT >(r, c, s, w);
255
262
256
- tools::LevelSetRayIntersector<FloatGrid > lsri (*ls);
263
+ tools::LevelSetRayIntersector<GridT > lsri (*ls);
257
264
258
265
Vec3T dir (1.0 , 1.0 , 1.0 ); dir.normalize ();
259
266
const Vec3T eye (0.0 , 0.0 , 0.0 );
260
267
RayT ray (eye, dir);
261
268
// std::cerr << "ray: " << ray << std::endl;
262
269
Vec3T xyz (0 );
263
270
Real time = 0 ;
271
+ constexpr double tolerance = std::is_floating_point_v<typename GridT::ValueType> ? 1e-6 : 2e-5 ;
272
+
264
273
EXPECT_TRUE (lsri.intersectsWS (ray, xyz, time));
265
274
// std::cerr << "\nIntersection at xyz = " << xyz << std::endl;
266
275
// analytical intersection test
267
276
double t0=0 , t1=0 ;
268
277
EXPECT_TRUE (ray.intersects (c, r, t0, t1));
269
- ASSERT_DOUBLES_APPROX_EQUAL (t0, time);
270
- ASSERT_DOUBLES_APPROX_EQUAL ((ray (t0)-c).length ()-r, 0 );
271
- ASSERT_DOUBLES_APPROX_EQUAL ((ray (t1)-c).length ()-r, 0 );
278
+ EXPECT_NEAR (t0, time, tolerance );
279
+ EXPECT_NEAR ((ray (t0)-c).length ()-r, 0 , tolerance );
280
+ EXPECT_NEAR ((ray (t1)-c).length ()-r, 0 , tolerance );
272
281
// std::cerr << "\nray("<<t0<<")="<<ray(t0)<<std::endl;
273
282
// std::cerr << "\nray("<<t1<<")="<<ray(t1)<<std::endl;
274
283
const Vec3T delta = xyz - ray (t0);
275
284
// std::cerr << "delta = " << delta << std::endl;
276
285
// std::cerr << "|delta|/dx=" << (delta.length()/ls->voxelSize()[0]) << std::endl;
277
- ASSERT_DOUBLES_APPROX_EQUAL (0 , delta.length ());
286
+ EXPECT_NEAR (0 , delta.length (), tolerance );
278
287
}
279
288
280
289
{// test intersections against a high-resolution level set sphere @1024^3
281
290
const float r = 5 .0f ;
282
291
const Vec3f c (10 .0f , 10 .0f , 20 .0f );
283
292
const float s = 0 .01f , w = 2 .0f ;
284
293
double t0=0 , t1=0 ;
285
- FloatGrid ::Ptr ls = tools::createLevelSetSphere<FloatGrid >(r, c, s, w);
294
+ typename GridT ::Ptr ls = tools::createLevelSetSphere<GridT >(r, c, s, w);
286
295
287
- typedef tools::LinearSearchImpl<FloatGrid , /* iterations=*/ 2 > SearchImplT;
288
- tools::LevelSetRayIntersector<FloatGrid , SearchImplT> lsri (*ls);
296
+ typedef tools::LinearSearchImpl<GridT , /* iterations=*/ 2 > SearchImplT;
297
+ tools::LevelSetRayIntersector<GridT , SearchImplT> lsri (*ls);
289
298
290
299
Vec3T xyz (0 );
291
300
Real time = 0 ;
@@ -308,6 +317,16 @@ TEST_F(TestLevelSetRayIntersector, tests)
308
317
}
309
318
}
310
319
320
+
321
+ TEST_F (TestLevelSetRayIntersector, testLevelSetRayIntersectorFloat)
322
+ {
323
+ testLevelSetRayIntersectorImpl<openvdb::FloatGrid>();
324
+ }
325
+
326
+ TEST_F (TestLevelSetRayIntersector, testLevelSetRayIntersectorHalf)
327
+ {
328
+ testLevelSetRayIntersectorImpl<openvdb::HalfGrid>();
329
+ }
311
330
#ifdef STATS_TEST
312
331
TEST_F (TestLevelSetRayIntersector, stats)
313
332
{
0 commit comments