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