@@ -241,44 +241,64 @@ minMaxTest()
241241{
242242 using ValueT = typename TreeT::ValueType;
243243
244- struct Local {
245- static bool isEqual (const ValueT& a, const ValueT& b) {
246- using namespace openvdb ; // for operator>()
247- return !(math::Abs (a - b) > zeroVal<ValueT>());
248- }
249- };
250-
251244 const ValueT
252245 zero = openvdb::zeroVal<ValueT>(),
253246 minusTwo = zero + (-2 ),
254247 plusTwo = zero + 2 ,
255- five = zero + 5 ;
248+ five = zero + 5 ,
249+ ten = zero + 10 ,
250+ twenty = zero + 20 ;
251+
252+ static constexpr int64_t DIM = TreeT::LeafNodeType::DIM;
256253
257254 TreeT tree (/* background=*/ five);
258255
259256 // No set voxels (defaults to min = max = zero)
260257 openvdb::math::MinMax<ValueT> extrema = openvdb::tools::minMax (tree);
261- EXPECT_TRUE ( Local::isEqual ( extrema.min (), zero ));
262- EXPECT_TRUE ( Local::isEqual ( extrema.max (), zero ));
258+ EXPECT_EQ (zero, extrema.min ());
259+ EXPECT_EQ (zero, extrema.max ());
263260
264261 // Only one set voxel
265- tree.setValue (openvdb::Coord (0 , 0 , 0 ), minusTwo);
262+ tree.setValue (openvdb::Coord (0 ), minusTwo);
266263 extrema = openvdb::tools::minMax (tree);
267- EXPECT_TRUE ( Local::isEqual ( extrema.min (), minusTwo ));
268- EXPECT_TRUE ( Local::isEqual ( extrema.max (), minusTwo ));
264+ EXPECT_EQ (minusTwo, extrema.min ());
265+ EXPECT_EQ (minusTwo, extrema.max ());
269266
270267 // Multiple set voxels, single value
271- tree.setValue (openvdb::Coord (10 , 10 , 10 ), minusTwo);
268+ tree.setValue (openvdb::Coord (DIM ), minusTwo);
272269 extrema = openvdb::tools::minMax (tree);
273- EXPECT_TRUE ( Local::isEqual ( extrema.min (), minusTwo ));
274- EXPECT_TRUE ( Local::isEqual ( extrema.max (), minusTwo ));
270+ EXPECT_EQ (minusTwo, extrema.min ());
271+ EXPECT_EQ (minusTwo, extrema.max ());
275272
276273 // Multiple set voxels, multiple values
277- tree.setValue (openvdb::Coord (10 , 10 , 10 ), plusTwo);
278- tree.setValue (openvdb::Coord (-10 , -10 , -10 ), zero);
274+ tree.setValue (openvdb::Coord (DIM), plusTwo);
275+ tree.setValue (openvdb::Coord (DIM*2 ), zero);
276+ extrema = openvdb::tools::minMax (tree);
277+ EXPECT_EQ (minusTwo, extrema.min ());
278+ EXPECT_EQ (plusTwo, extrema.max ());
279+
280+ // add some empty leaf nodes to test the join op
281+ tree.setValueOnly (openvdb::Coord (DIM*3 ), ten);
282+ tree.setValueOnly (openvdb::Coord (DIM*4 ),-ten);
283+ extrema = openvdb::tools::minMax (tree);
284+ EXPECT_EQ (minusTwo, extrema.min ());
285+ EXPECT_EQ (plusTwo, extrema.max ());
286+
287+ tree.clear ();
288+
289+ // test tiles
290+ using NodeChainT = typename TreeT::RootNodeType::NodeChainType;
291+ using ChildT1 = typename NodeChainT::template Get<1 >; // Leaf parent
292+ using ChildT2 = typename NodeChainT::template Get<2 >; // ChildT1 parent
293+ tree.addTile (ChildT2::LEVEL, openvdb::Coord (0 ), -ten, true );
294+ tree.addTile (ChildT2::LEVEL, openvdb::Coord (ChildT2::DIM), ten, true );
295+ tree.addTile (ChildT1::LEVEL, openvdb::Coord (ChildT2::DIM + ChildT2::DIM), -twenty, false );
296+ tree.setValueOnly (openvdb::Coord (-1 ), twenty);
297+ tree.setValue (openvdb::Coord (-2 ), five);
298+
279299 extrema = openvdb::tools::minMax (tree);
280- EXPECT_TRUE ( Local::isEqual ( extrema.min (), minusTwo ));
281- EXPECT_TRUE ( Local::isEqual ( extrema.max (), plusTwo ));
300+ EXPECT_EQ (-ten, extrema.min ());
301+ EXPECT_EQ ( ten, extrema.max ());
282302}
283303
284304// / Specialization for boolean trees
0 commit comments