Changeset 3769 for trunk/packages
- Timestamp:
- Jul 10, 2013 1:47:00 PM (11 years ago)
- Location:
- trunk/packages/vizservers/vtkvis
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/packages/vizservers/vtkvis/Glyphs.cpp
r3696 r3769 29 29 #include <vtkTransformPolyDataFilter.h> 30 30 #include <vtkPolyDataNormals.h> 31 #include <vtkDelaunay2D.h> 32 #include <vtkDelaunay3D.h> 33 #include <vtkPolyData.h> 34 #include <vtkUnstructuredGrid.h> 31 35 32 36 #include "Glyphs.h" 33 37 #include "Renderer.h" 38 #include "Math.h" 34 39 #include "Trace.h" 35 40 … … 280 285 _glyphMapper = vtkSmartPointer<vtkGlyph3DMapper>::New(); 281 286 _glyphMapper->SetResolveCoincidentTopologyToPolygonOffset(); 287 // If there are color scalars, use them without lookup table (if scalar visibility is on) 288 _glyphMapper->SetColorModeToDefault(); 282 289 _glyphMapper->ScalarVisibilityOn(); 283 290 } … … 323 330 } 324 331 325 double cellSizeRange[2]; 326 double avgSize; 327 _dataSet->getCellSizeRange(cellSizeRange, &avgSize); 328 //_dataScale = cellSizeRange[0] + (cellSizeRange[1] - cellSizeRange[0])/2.; 329 _dataScale = avgSize; 330 331 TRACE("Cell size range: %g,%g, Data scale factor: %g", 332 cellSizeRange[0], cellSizeRange[1], _dataScale); 332 if (_dataSet->isCloud()) { 333 PrincipalPlane plane; 334 double offset; 335 if (_dataSet->is2D(&plane, &offset)) { 336 // 2D cloud 337 vtkSmartPointer<vtkDelaunay2D> mesher = vtkSmartPointer<vtkDelaunay2D>::New(); 338 if (plane == PLANE_ZY) { 339 vtkSmartPointer<vtkTransform> trans = vtkSmartPointer<vtkTransform>::New(); 340 trans->RotateWXYZ(90, 0, 1, 0); 341 if (offset != 0.0) { 342 trans->Translate(-offset, 0, 0); 343 } 344 mesher->SetTransform(trans); 345 } else if (plane == PLANE_XZ) { 346 vtkSmartPointer<vtkTransform> trans = vtkSmartPointer<vtkTransform>::New(); 347 trans->RotateWXYZ(-90, 1, 0, 0); 348 if (offset != 0.0) { 349 trans->Translate(0, -offset, 0); 350 } 351 mesher->SetTransform(trans); 352 } else if (offset != 0.0) { 353 // XY with Z offset 354 vtkSmartPointer<vtkTransform> trans = vtkSmartPointer<vtkTransform>::New(); 355 trans->Translate(0, 0, -offset); 356 mesher->SetTransform(trans); 357 } 358 #ifdef USE_VTK6 359 mesher->SetInputData(ds); 360 #else 361 mesher->SetInput(ds); 362 #endif 363 mesher->Update(); 364 vtkPolyData *pd = mesher->GetOutput(); 365 if (pd->GetNumberOfPolys() == 0) { 366 // Meshing failed, fall back to scale based on bounds 367 double bounds[6]; 368 _dataSet->getBounds(bounds); 369 double xlen = bounds[1] - bounds[0]; 370 double ylen = bounds[3] - bounds[2]; 371 double zlen = bounds[5] - bounds[4]; 372 double max = max3(xlen, ylen, zlen); 373 _dataScale = max / 64.0; 374 } else { 375 double cellSizeRange[2]; 376 double avgSize; 377 DataSet::getCellSizeRange(pd, cellSizeRange, &avgSize); 378 _dataScale = avgSize * 2.0; 379 } 380 } else { 381 // 3D cloud 382 vtkSmartPointer<vtkDelaunay3D> mesher = vtkSmartPointer<vtkDelaunay3D>::New(); 383 #ifdef USE_VTK6 384 mesher->SetInputData(ds); 385 #else 386 mesher->SetInput(ds); 387 #endif 388 mesher->Update(); 389 vtkUnstructuredGrid *ugrid = mesher->GetOutput(); 390 if (ugrid->GetNumberOfCells() == 0) { 391 // Meshing failed, fall back to scale based on bounds 392 double bounds[6]; 393 _dataSet->getBounds(bounds); 394 double xlen = bounds[1] - bounds[0]; 395 double ylen = bounds[3] - bounds[2]; 396 double zlen = bounds[5] - bounds[4]; 397 double max = max3(xlen, ylen, zlen); 398 _dataScale = max / 64.0; 399 } else { 400 double cellSizeRange[2]; 401 double avgSize; 402 DataSet::getCellSizeRange(ugrid, cellSizeRange, &avgSize); 403 _dataScale = avgSize * 2.0; 404 } 405 } 406 } else { 407 double cellSizeRange[2]; 408 double avgSize; 409 _dataSet->getCellSizeRange(cellSizeRange, &avgSize); 410 _dataScale = avgSize * 2.0; 411 } 412 413 TRACE("Data scale factor: %g", _dataScale); 333 414 334 415 // Normalize sizes to [0,1] * ScaleFactor 335 416 _glyphMapper->SetClamping(_normalizeScale ? 1 : 0); 336 _glyphMapper->SetScaleFactor(_scaleFactor * _dataScale); 417 if (_normalizeScale) { 418 _glyphMapper->SetScaleFactor(_scaleFactor * _dataScale); 419 TRACE("Setting scale factor: %g", _scaleFactor * _dataScale); 420 } else { 421 _glyphMapper->SetScaleFactor(_scaleFactor); 422 TRACE("Setting scale factor: %g", _scaleFactor); 423 } 337 424 _glyphMapper->ScalingOn(); 338 425 … … 363 450 if (_glyphMapper != NULL) { 364 451 _glyphMapper->SetClamping(_normalizeScale ? 1 : 0); 452 if (_normalizeScale) { 453 _glyphMapper->SetScaleFactor(_scaleFactor * _dataScale); 454 TRACE("Setting scale factor: %g", _scaleFactor * _dataScale); 455 } else { 456 _glyphMapper->SetScaleFactor(_scaleFactor); 457 TRACE("Setting scale factor: %g", _scaleFactor); 458 } 365 459 } 366 460 } … … 667 761 _scaleFactor = scale; 668 762 if (_glyphMapper != NULL) { 669 _glyphMapper->SetScaleFactor(_scaleFactor * _dataScale); 763 if (_normalizeScale) { 764 _glyphMapper->SetScaleFactor(_scaleFactor * _dataScale); 765 TRACE("Setting scale factor: %g", _scaleFactor * _dataScale); 766 } else { 767 _glyphMapper->SetScaleFactor(_scaleFactor); 768 TRACE("Setting scale factor: %g", _scaleFactor); 769 } 670 770 } 671 771 } … … 787 887 788 888 /** 889 * \brief Limit the number of glyphs displayed 890 * 891 * The choice of glyphs to display can be based on sampling every 892 * n-th point (ratio) or by random sample 893 * 894 * \param max Maximum number of glyphs to display, negative means display all 895 * \param random Flag to enable/disable random sampling 896 * \param offset If random is false, this controls the first sample point 897 * \param ratio If random is false, this ratio controls every n-th point sampling 898 */ 899 void Glyphs::setMaximumNumberOfGlyphs(int max, bool random, int offset, int ratio) 900 { 901 if (_dataSet == NULL || _glyphMapper == NULL) 902 return; 903 904 if (max < 0) { 905 if (_maskPoints != NULL) { 906 #ifdef USE_VTK6 907 _glyphMapper->SetInputData(_dataSet->getVtkDataSet()); 908 #else 909 _glyphMapper->SetInputConnection(_dataSet->getVtkDataSet()->GetProducerPort()); 910 #endif 911 _maskPoints = NULL; 912 } 913 } else { 914 if (_maskPoints == NULL) { 915 _maskPoints = vtkSmartPointer<vtkMaskPoints>::New(); 916 } 917 #ifdef USE_VTK6 918 _maskPoints->SetInputData(_dataSet->getVtkDataSet()); 919 #else 920 _maskPoints->SetInput(_dataSet->getVtkDataSet()); 921 #endif 922 _maskPoints->SetMaximumNumberOfPoints(max); 923 _maskPoints->SetOffset(offset); 924 _maskPoints->SetOnRatio(ratio); 925 _maskPoints->SetRandomMode((random ? 1 : 0)); 926 _maskPoints->GenerateVerticesOff(); 927 _glyphMapper->SetInputConnection(_maskPoints->GetOutputPort()); 928 } 929 } 930 931 /** 789 932 * \brief Set a group of world coordinate planes to clip rendering 790 933 * -
trunk/packages/vizservers/vtkvis/Glyphs.h
r3677 r3769 16 16 #include <vtkVersion.h> 17 17 #include <vtkGlyph3DMapper.h> 18 #include <vtkMaskPoints.h> 18 19 #include <vtkLookupTable.h> 19 20 #include <vtkPlaneCollection.h> … … 92 93 void setScaleFactor(double scale); 93 94 95 void setMaximumNumberOfGlyphs(int max, bool random = true, 96 int offset = 0, int ratio = 1); 97 94 98 void setColorMap(ColorMap *colorMap); 95 99 … … 136 140 vtkSmartPointer<vtkPolyDataAlgorithm> _glyphSource; 137 141 vtkSmartPointer<vtkGlyph3DMapper> _glyphMapper; 142 vtkSmartPointer<vtkMaskPoints> _maskPoints; 138 143 }; 139 144
Note: See TracChangeset
for help on using the changeset viewer.