1 //============================================================================
2 //  Copyright (c) Kitware, Inc.
3 //  All rights reserved.
4 //  See LICENSE.txt for details.
5 //
6 //  This software is distributed WITHOUT ANY WARRANTY; without even
7 //  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
8 //  PURPOSE.  See the above copyright notice for more information.
9 //============================================================================
10 
11 #include <vtkm/filter/ClipWithImplicitFunction.h>
12 
13 #include <vtkm/cont/testing/MakeTestDataSet.h>
14 #include <vtkm/cont/testing/Testing.h>
15 
16 namespace
17 {
18 
19 using Coord3D = vtkm::Vec3f;
20 
MakeTestDatasetStructured()21 vtkm::cont::DataSet MakeTestDatasetStructured()
22 {
23   static constexpr vtkm::Id xdim = 3, ydim = 3;
24   static const vtkm::Id2 dim(xdim, ydim);
25   static constexpr vtkm::Id numVerts = xdim * ydim;
26 
27   vtkm::Float32 scalars[numVerts];
28   for (vtkm::Id i = 0; i < numVerts; ++i)
29   {
30     scalars[i] = 1.0f;
31   }
32   scalars[4] = 0.0f;
33 
34   vtkm::cont::DataSet ds;
35   vtkm::cont::DataSetBuilderUniform builder;
36   ds = builder.Create(dim);
37 
38   ds.AddPointField("scalars", scalars, numVerts);
39 
40   return ds;
41 }
42 
TestClipStructured()43 void TestClipStructured()
44 {
45   std::cout << "Testing ClipWithImplicitFunction Filter on Structured data" << std::endl;
46 
47   vtkm::cont::DataSet ds = MakeTestDatasetStructured();
48 
49   vtkm::Vec3f center(1, 1, 0);
50   vtkm::FloatDefault radius(0.5);
51 
52   vtkm::filter::ClipWithImplicitFunction clip;
53   clip.SetImplicitFunction(vtkm::Sphere(center, radius));
54   clip.SetFieldsToPass("scalars");
55 
56   vtkm::cont::DataSet outputData = clip.Execute(ds);
57 
58   VTKM_TEST_ASSERT(outputData.GetNumberOfCoordinateSystems() == 1,
59                    "Wrong number of coordinate systems in the output dataset");
60   VTKM_TEST_ASSERT(outputData.GetNumberOfFields() == 1,
61                    "Wrong number of fields in the output dataset");
62   VTKM_TEST_ASSERT(outputData.GetNumberOfCells() == 8,
63                    "Wrong number of cells in the output dataset");
64 
65   vtkm::cont::UnknownArrayHandle temp = outputData.GetField("scalars").GetData();
66   vtkm::cont::ArrayHandle<vtkm::Float32> resultArrayHandle;
67   temp.AsArrayHandle(resultArrayHandle);
68 
69   VTKM_TEST_ASSERT(resultArrayHandle.GetNumberOfValues() == 13,
70                    "Wrong number of points in the output dataset");
71 
72   vtkm::Float32 expected[13] = { 1, 1, 1, 1, 0, 1, 1, 1, 1, 0.25, 0.25, 0.25, 0.25 };
73   for (int i = 0; i < 13; ++i)
74   {
75     VTKM_TEST_ASSERT(test_equal(resultArrayHandle.ReadPortal().Get(i), expected[i]),
76                      "Wrong result for ClipWithImplicitFunction fliter on sturctured quads data");
77   }
78 }
79 
TestClipStructuredInverted()80 void TestClipStructuredInverted()
81 {
82   std::cout << "Testing ClipWithImplicitFunctionInverted Filter on Structured data" << std::endl;
83 
84   vtkm::cont::DataSet ds = MakeTestDatasetStructured();
85 
86   vtkm::Vec3f center(1, 1, 0);
87   vtkm::FloatDefault radius(0.5);
88 
89   vtkm::filter::ClipWithImplicitFunction clip;
90   clip.SetImplicitFunction(vtkm::Sphere(center, radius));
91   bool invert = true;
92   clip.SetInvertClip(invert);
93   clip.SetFieldsToPass("scalars");
94   auto outputData = clip.Execute(ds);
95 
96   VTKM_TEST_ASSERT(outputData.GetNumberOfFields() == 1,
97                    "Wrong number of fields in the output dataset");
98   VTKM_TEST_ASSERT(outputData.GetNumberOfCells() == 4,
99                    "Wrong number of cells in the output dataset");
100 
101   vtkm::cont::UnknownArrayHandle temp = outputData.GetField("scalars").GetData();
102   vtkm::cont::ArrayHandle<vtkm::Float32> resultArrayHandle;
103   temp.AsArrayHandle(resultArrayHandle);
104 
105   VTKM_TEST_ASSERT(resultArrayHandle.GetNumberOfValues() == 13,
106                    "Wrong number of points in the output dataset");
107 
108   vtkm::Float32 expected[13] = { 1, 1, 1, 1, 0, 1, 1, 1, 1, 0.25, 0.25, 0.25, 0.25 };
109   for (int i = 0; i < 13; ++i)
110   {
111     VTKM_TEST_ASSERT(test_equal(resultArrayHandle.ReadPortal().Get(i), expected[i]),
112                      "Wrong result for ClipWithImplicitFunction fliter on sturctured quads data");
113   }
114 }
115 
TestClip()116 void TestClip()
117 {
118   //todo: add more clip tests
119   TestClipStructured();
120   TestClipStructuredInverted();
121 }
122 
123 } // anonymous namespace
124 
UnitTestClipWithImplicitFunctionFilter(int argc,char * argv[])125 int UnitTestClipWithImplicitFunctionFilter(int argc, char* argv[])
126 {
127   return vtkm::cont::testing::Testing::Run(TestClip, argc, argv);
128 }
129