60 vtkInformationVector **inputVector,
61 vtkInformationVector *outputVector) {
66 const auto input = vtkDataSet::GetData(inputVector[0]);
67 const auto polygon = vtkUnstructuredGrid::GetData(inputVector[1]);
68 auto output = vtkPolyData::GetData(outputVector);
70 const auto dataUfield = this->GetInputArrayToProcess(0, input);
71 const auto dataVfield = this->GetInputArrayToProcess(1, input);
72 const auto polygonUfield = this->GetInputArrayToProcess(2, polygon);
73 const auto polygonVfield = this->GetInputArrayToProcess(3, polygon);
75 if(dataUfield ==
nullptr || dataVfield ==
nullptr || polygonUfield ==
nullptr
76 || polygonVfield ==
nullptr) {
77 this->
printErr(
"Could not find data array");
81 if(!(input->GetDataObjectType() == VTK_UNSTRUCTURED_GRID
82 || input->GetDataObjectType() == VTK_IMAGE_DATA)) {
83 this->
printErr(
"Unsupported VTK data structure");
88 if(triangulation ==
nullptr) {
93 outputVertexList_.clear();
98 threadedTriangleList_.resize(polygon->GetNumberOfCells());
99 threadedVertexList_.resize(polygon->GetNumberOfCells());
105#ifdef TTK_ENABLE_FIBER_SURFACE_WITH_RANGE_OCTREE
106 if((!RangeOctree) || (dataUfield->GetMTime() > GetMTime())
107 || (dataVfield->GetMTime() > GetMTime())) {
109 this->
printMsg(
"Resetting octree...");
116 inputPolygon_.clear();
118 SimplexId const cellNumber = polygon->GetNumberOfCells();
119 vtkCellArray *connectivity = polygon->GetCells();
121#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 6, 1)
122 if(connectivity->GetConnectivityArray()->GetNumberOfTuples() < cellNumber) {
124 if(connectivity->GetData()->GetNumberOfTuples() < 3 * cellNumber) {
126 this->
printErr(
"Error: ill-defined range polygon.");
130#if !defined(_WIN32) || defined(_WIN32) && defined(VTK_USE_64BIT_IDS)
131#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 6, 1)
132 vtkNew<vtkIdTypeArray> legacyFormat;
133 connectivity->ExportLegacyFormat(legacyFormat);
134 const long long int *cellArray
135 = (
const long long int *)legacyFormat->GetPointer(0);
137 const long long int *cellArray = connectivity->GetData()->GetPointer(0);
140 int *pt = connectivity->GetPointer();
141 long long extra_pt = *pt;
142 const long long int *cellArray = &extra_pt;
146 std::pair<std::pair<double, double>, std::pair<double, double>> rangeEdge;
148 for(
SimplexId i = 0; i < cellNumber; i++) {
150 vertexId0 = cellArray[3 * i + 1];
151 vertexId1 = cellArray[3 * i + 2];
153 rangeEdge.first.first = polygonUfield->GetTuple1(vertexId0);
154 rangeEdge.first.second = polygonVfield->GetTuple1(vertexId0);
156 rangeEdge.second.first = polygonUfield->GetTuple1(vertexId1);
157 rangeEdge.second.second = polygonVfield->GetTuple1(vertexId1);
159 inputPolygon_.push_back(rangeEdge);
162 for(
size_t i = 0; i < threadedTriangleList_.size(); i++) {
163 threadedTriangleList_[i].clear();
165 threadedVertexList_[i].clear();
169#ifndef TTK_ENABLE_DOUBLE_TEMPLATING
170 if(dataUfield->GetDataType() != dataVfield->GetDataType()) {
172 "Scalar fields should have same input type. Use TTKPointDataConverter or "
173 "TTKArrayEditor to convert array types.");
176 switch(dataUfield->GetDataType()) {
180 switch(vtkTemplate2PackMacro(
181 dataUfield->GetDataType(), dataVfield->GetDataType())) {
190 size_t triangleNumber = 0;
192 for(
size_t i = 0; i < threadedTriangleList_.size(); i++) {
193 triangleNumber += threadedTriangleList_[i].size();
196 vtkNew<vtkPoints> outputVertexList{};
197 vtkNew<vtkDoubleArray> outputU{};
198 vtkNew<vtkDoubleArray> outputV{};
199 vtkNew<vtkDoubleArray> outputParameterization{};
200 vtkNew<vtkCellArray> outputTriangleList{};
201 vtkNew<ttkSimplexIdTypeArray> outputEdgeIds{};
202 vtkNew<ttkSimplexIdTypeArray> outputTetIds{};
203 vtkNew<ttkSimplexIdTypeArray> outputCaseIds{};
205 if(RangeCoordinates) {
206 outputU->SetName(dataUfield->GetName());
207 outputU->SetNumberOfTuples(outputVertexList_.size());
209 outputV->SetName(dataVfield->GetName());
210 outputV->SetNumberOfTuples(outputVertexList_.size());
213 if(EdgeParameterization) {
214 outputParameterization->SetName(
"EdgeParameterization");
215 outputParameterization->SetNumberOfTuples(outputVertexList_.size());
218 outputVertexList->SetNumberOfPoints(outputVertexList_.size());
219 output->SetPoints(outputVertexList);
221#ifdef TTK_ENABLE_OPENMP
222#pragma omp parallel for num_threads(threadNumber_)
224 for(
size_t i = 0; i < outputVertexList_.size(); i++) {
225 outputVertexList->SetPoint(i, outputVertexList_[i].p_[0],
226 outputVertexList_[i].p_[1],
227 outputVertexList_[i].p_[2]);
228 if(RangeCoordinates) {
229 outputU->SetTuple1(i, outputVertexList_[i].uv_.first);
230 outputV->SetTuple1(i, outputVertexList_[i].uv_.second);
232 if(EdgeParameterization) {
233 outputParameterization->SetTuple1(i, outputVertexList_[i].t_);
236 if(RangeCoordinates) {
237 output->GetPointData()->AddArray(outputU);
238 output->GetPointData()->AddArray(outputV);
240 output->GetPointData()->RemoveArray(dataUfield->GetName());
241 output->GetPointData()->RemoveArray(dataVfield->GetName());
243 if(EdgeParameterization) {
244 output->GetPointData()->AddArray(outputParameterization);
246 output->GetPointData()->RemoveArray(
"EdgeParameterization");
250 outputEdgeIds->SetName(
"EdgeIds");
251 outputEdgeIds->SetNumberOfTuples(triangleNumber);
255 outputTetIds->SetName(
"TetIds");
256 outputTetIds->SetNumberOfTuples(triangleNumber);
260 outputCaseIds->SetName(
"CaseIds");
261 outputCaseIds->SetNumberOfTuples(triangleNumber);
264 vtkNew<vtkIdList> idList{};
265 idList->SetNumberOfIds(3);
268 for(
size_t i = 0; i < threadedTriangleList_.size(); i++) {
269 for(
size_t j = 0; j < threadedTriangleList_[i].size(); j++) {
270 for(
int k = 0; k < 3; k++) {
271 idList->SetId(k, threadedTriangleList_[i][j].vertexIds_[k]);
273 outputTriangleList->InsertNextCell(idList);
275 outputEdgeIds->SetTuple1(triangleNumber, i);
278 outputTetIds->SetTuple1(
279 triangleNumber, threadedTriangleList_[i][j].tetId_);
282 outputCaseIds->SetTuple1(
283 triangleNumber, threadedTriangleList_[i][j].caseId_);
288 output->SetPolys(outputTriangleList);
290 output->GetCellData()->AddArray(outputEdgeIds);
292 output->GetCellData()->RemoveArray(
"EdgeIds");
295 output->GetCellData()->AddArray(outputTetIds);
297 output->GetCellData()->RemoveArray(
"TetIds");
300 output->GetCellData()->AddArray(outputCaseIds);
302 output->GetCellData()->RemoveArray(
"CaseIds");