Changeset 3769 for trunk/packages


Ignore:
Timestamp:
Jul 10, 2013 1:47:00 PM (11 years ago)
Author:
ldelgass
Message:

Tweak scaling for glyphs: don't apply dataset specific scale factor if not
normalizing scaling. When computing datset scale factor, mesh point clouds to
get cell size (this can fail however), fall back to fraction of bounding box.
Also, bump up scale factor (which controls max size) by two times. Add method
to mask glyph points to a maximum number (protocol to come).

Location:
trunk/packages/vizservers/vtkvis
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/vtkvis/Glyphs.cpp

    r3696 r3769  
    2929#include <vtkTransformPolyDataFilter.h>
    3030#include <vtkPolyDataNormals.h>
     31#include <vtkDelaunay2D.h>
     32#include <vtkDelaunay3D.h>
     33#include <vtkPolyData.h>
     34#include <vtkUnstructuredGrid.h>
    3135
    3236#include "Glyphs.h"
    3337#include "Renderer.h"
     38#include "Math.h"
    3439#include "Trace.h"
    3540
     
    280285        _glyphMapper = vtkSmartPointer<vtkGlyph3DMapper>::New();
    281286        _glyphMapper->SetResolveCoincidentTopologyToPolygonOffset();
     287        // If there are color scalars, use them without lookup table (if scalar visibility is on)
     288        _glyphMapper->SetColorModeToDefault();
    282289        _glyphMapper->ScalarVisibilityOn();
    283290    }
     
    323330    }
    324331
    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);
    333414
    334415    // Normalize sizes to [0,1] * ScaleFactor
    335416    _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    }
    337424    _glyphMapper->ScalingOn();
    338425
     
    363450        if (_glyphMapper != NULL) {
    364451            _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            }
    365459        }
    366460    }
     
    667761    _scaleFactor = scale;
    668762    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        }
    670770    }
    671771}
     
    787887
    788888/**
     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 */
     899void 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/**
    789932 * \brief Set a group of world coordinate planes to clip rendering
    790933 *
  • trunk/packages/vizservers/vtkvis/Glyphs.h

    r3677 r3769  
    1616#include <vtkVersion.h>
    1717#include <vtkGlyph3DMapper.h>
     18#include <vtkMaskPoints.h>
    1819#include <vtkLookupTable.h>
    1920#include <vtkPlaneCollection.h>
     
    9293    void setScaleFactor(double scale);
    9394
     95    void setMaximumNumberOfGlyphs(int max, bool random = true,
     96                                  int offset = 0, int ratio = 1);
     97
    9498    void setColorMap(ColorMap *colorMap);
    9599
     
    136140    vtkSmartPointer<vtkPolyDataAlgorithm> _glyphSource;
    137141    vtkSmartPointer<vtkGlyph3DMapper> _glyphMapper;
     142    vtkSmartPointer<vtkMaskPoints> _maskPoints;
    138143};
    139144
Note: See TracChangeset for help on using the changeset viewer.