Changeset 3682


Ignore:
Timestamp:
Jun 10, 2013 12:21:22 AM (10 years ago)
Author:
ldelgass
Message:

Streamlines:

  • Set a default max. of 500 seeds for points of a mesh and make 'streamlines seed numpts' set the max when using this seed type (setting a numpts < 0 will give the previous behavior of using all points of the mesh).
  • Add point size option for seeds.
  • Add protocol for setting streamlines terminal speed.
  • NOTE: Streamlines on 2D meshes seem to only work if there is no plane offset

LIC:

  • Add support for clouds by meshing before resampling to an image.
Location:
trunk/packages/vizservers/vtkvis
Files:
8 edited

Legend:

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

    r3680 r3682  
    185185            }
    186186        }
     187        if (ds->GetPointData()->GetScalars() != NULL) {
     188            TRACE("Active point scalars: %s", ds->GetPointData()->GetScalars()->GetName());
     189        }
     190        if (ds->GetPointData()->GetVectors() != NULL) {
     191            TRACE("Active point vectors: %s", ds->GetPointData()->GetVectors()->GetName());
     192        }
    187193    }
    188194    if (ds->GetCellData() != NULL) {
     
    200206                      ds->GetCellData()->GetAbstractArray(i)->GetNumberOfComponents());
    201207            }
     208        }
     209        if (ds->GetCellData()->GetScalars() != NULL) {
     210            TRACE("Active cell scalars: %s", ds->GetPointData()->GetScalars()->GetName());
     211        }
     212        if (ds->GetCellData()->GetVectors() != NULL) {
     213            TRACE("Active cell vectors: %s", ds->GetPointData()->GetVectors()->GetName());
    202214        }
    203215    }
     
    407419    getBounds(bounds);
    408420    if (bounds[4] == bounds[5]) {
    409         // Z = 0, XY plane
     421        // Zmin = Zmax, XY plane
    410422        if (plane != NULL) {
    411423            *plane = PLANE_XY;
     
    415427        return true;
    416428    } else if (bounds[0] == bounds[1]) {
    417         // X = 0, ZY plane
     429        // Xmin = Xmax, ZY plane
    418430        if (plane != NULL) {
    419431            *plane = PLANE_ZY;
     
    423435        return true;
    424436    } else if (bounds[2] == bounds[3]) {
    425         // Y = 0, XZ plane
     437        // Ymin = Ymax, XZ plane
    426438        if (plane != NULL) {
    427439            *plane = PLANE_XZ;
  • trunk/packages/vizservers/vtkvis/LIC.cpp

    r3621 r3682  
    2121#include <vtkImageMask.h>
    2222#include <vtkImageCast.h>
     23#include <vtkDelaunay2D.h>
     24#include <vtkDelaunay3D.h>
     25#include <vtkTransform.h>
    2326
    2427#include "LIC.h"
     
    109112            _lic->SetInputConnection(_volumeSlicer->GetOutputPort());
    110113        } else {
    111             // 2D image/volume/uniform grid
     114            // 2D image/uniform grid
    112115#ifdef USE_VTK6
    113116            _lic->SetInputData(ds);
     
    120123        }
    121124        _mapper->SetInputConnection(_lic->GetOutputPort());
    122     } else if (vtkPolyData::SafeDownCast(ds) == NULL) {
    123         // structured grid, unstructured grid, or rectilinear grid
     125    } else if (vtkPolyData::SafeDownCast(ds) == NULL ||
     126               _dataSet->isCloud() ||
     127               _dataSet->is2D()) {
     128        // structured/rectilinear/unstructured grid, cloud or 2D polydata
    124129        if (_lic == NULL) {
    125130            _lic = vtkSmartPointer<vtkImageDataLIC2D>::New();
     
    140145            _probeFilter = vtkSmartPointer<vtkProbeFilter>::New();
    141146
    142         if (!_dataSet->is2D()) {
    143             // Sample a plane within the grid bounding box
     147        PrincipalPlane plane;
     148        double offset;
     149        if (!_dataSet->is2D(&plane, &offset)) {
     150            // 3D Data: Sample a plane within the bounding box
    144151            vtkSmartPointer<vtkCutter> cutter = vtkSmartPointer<vtkCutter>::New();
    145152            if (_cutPlane == NULL) {
     
    162169                                     bounds[4] + (bounds[5]-bounds[4])/2.);
    163170            }
    164 #ifdef USE_VTK6
    165             cutter->SetInputData(ds);
    166 #else
    167             cutter->SetInput(ds);
    168 #endif
     171
     172            if (_dataSet->isCloud()) {
     173                // 3D cloud -- Need to mesh it before we can resample
     174                vtkSmartPointer<vtkDelaunay3D> mesher = vtkSmartPointer<vtkDelaunay3D>::New();
     175#ifdef USE_VTK6
     176                mesher->SetInputData(ds);
     177#else
     178                mesher->SetInput(ds);
     179#endif
     180                cutter->SetInputConnection(mesher->GetOutputPort());
     181            } else {
     182#ifdef USE_VTK6
     183                cutter->SetInputData(ds);
     184#else
     185                cutter->SetInput(ds);
     186#endif
     187            }
    169188            cutter->SetCutFunction(_cutPlane);
    170189            _probeFilter->SetSourceConnection(cutter->GetOutputPort());
    171190        } else {
    172 #ifdef USE_VTK6
    173             _probeFilter->SetSourceData(ds);
    174 #else
    175             _probeFilter->SetSource(ds);
    176 #endif
     191            if (_dataSet->isCloud()) {
     192                // 2D cloud -- Need to mesh it before we can resample
     193                vtkSmartPointer<vtkDelaunay2D> mesher = vtkSmartPointer<vtkDelaunay2D>::New();
     194                if (plane == PLANE_ZY) {
     195                    vtkSmartPointer<vtkTransform> trans = vtkSmartPointer<vtkTransform>::New();
     196                    trans->RotateWXYZ(90, 0, 1, 0);
     197                    if (offset != 0.0) {
     198                        trans->Translate(-offset, 0, 0);
     199                    }
     200                    mesher->SetTransform(trans);
     201                } else if (plane == PLANE_XZ) {
     202                    vtkSmartPointer<vtkTransform> trans = vtkSmartPointer<vtkTransform>::New();
     203                    trans->RotateWXYZ(-90, 1, 0, 0);
     204                    if (offset != 0.0) {
     205                        trans->Translate(0, -offset, 0);
     206                    }
     207                    mesher->SetTransform(trans);
     208                } else if (offset != 0.0) {
     209                    // XY with Z offset
     210                    vtkSmartPointer<vtkTransform> trans = vtkSmartPointer<vtkTransform>::New();
     211                    trans->Translate(0, 0, -offset);
     212                    mesher->SetTransform(trans);
     213                }
     214#ifdef USE_VTK6
     215                mesher->SetInputData(ds);
     216#else
     217                mesher->SetInput(ds);
     218#endif
     219                _probeFilter->SetSourceConnection(mesher->GetOutputPort());
     220            } else {
     221#ifdef USE_VTK6
     222                _probeFilter->SetSourceData(ds);
     223#else
     224                _probeFilter->SetSource(ds);
     225#endif
     226            }
    177227        }
    178228
     
    239289        _mapper->SetInputConnection(mask->GetOutputPort());
    240290    } else {
    241         // DataSet is a PolyData
     291        // DataSet is a 3D PolyData with cells
    242292        vtkPolyData *pd = vtkPolyData::SafeDownCast(ds);
    243293        assert(pd != NULL);
  • trunk/packages/vizservers/vtkvis/Renderer.h

    r3680 r3682  
    762762    // Streamlines
    763763
     764    void setStreamlinesColorMode(const DataSetId& id,
     765                                 Streamlines::ColorMode mode,
     766                                 const char *name, double range[2] = NULL);
     767
     768    void setStreamlinesColorMode(const DataSetId& id,
     769                                 Streamlines::ColorMode mode,
     770                                 DataSet::DataAttributeType type,
     771                                 const char *name, double range[2] = NULL);
     772
     773    void setStreamlinesLength(const DataSetId& id, double length);
     774
    764775    void setStreamlinesNumberOfSeedPoints(const DataSetId& id, int numPoints);
    765776
    766     void setStreamlinesSeedToMeshPoints(const DataSetId& id);
     777    void setStreamlinesSeedColor(const DataSetId& id, float color[3]);
     778
     779    void setStreamlinesSeedPointSize(const DataSetId& id, float size);
     780
     781    void setStreamlinesSeedToMeshPoints(const DataSetId& id,
     782                                        int maxPoints = 500);
    767783
    768784    void setStreamlinesSeedToFilledMesh(const DataSetId& id, int numPoints);
    769785
    770786    bool setStreamlinesSeedToMeshPoints(const DataSetId& id,
    771                                         char *data, size_t nbytes);
     787                                        char *data, size_t nbytes,
     788                                        int maxPoints = 500);
    772789
    773790    bool setStreamlinesSeedToFilledMesh(const DataSetId& id,
     
    794811                                           int numSides, int numPoints);
    795812
    796     void setStreamlinesLength(const DataSetId& id, double length);
     813    void setStreamlinesSeedVisibility(const DataSetId& id, bool state);
     814
     815    void setStreamlinesTerminalSpeed(const DataSetId& id, double speed);
    797816
    798817    void setStreamlinesTypeToLines(const DataSetId& id);
     
    801820
    802821    void setStreamlinesTypeToRibbons(const DataSetId& id, double width, double angle);
    803 
    804     void setStreamlinesSeedVisibility(const DataSetId& id, bool state);
    805 
    806     void setStreamlinesColorMode(const DataSetId& id,
    807                                  Streamlines::ColorMode mode,
    808                                  const char *name, double range[2] = NULL);
    809 
    810     void setStreamlinesColorMode(const DataSetId& id,
    811                                  Streamlines::ColorMode mode,
    812                                  DataSet::DataAttributeType type,
    813                                  const char *name, double range[2] = NULL);
    814 
    815     void setStreamlinesSeedColor(const DataSetId& id, float color[3]);
    816822
    817823    // Volumes
  • trunk/packages/vizservers/vtkvis/RendererCmd.cpp

    r3680 r3682  
    93489348
    93499349static int
     9350StreamlinesSeedPointSizeOp(ClientData clientData, Tcl_Interp *interp, int objc,
     9351                           Tcl_Obj *const *objv)
     9352{
     9353    float size;
     9354    if (GetFloatFromObj(interp, objv[3], &size) != TCL_OK) {
     9355        return TCL_ERROR;
     9356    }
     9357    if (objc == 5) {
     9358        const char *name = Tcl_GetString(objv[4]);
     9359        g_renderer->setStreamlinesSeedPointSize(name, size);
     9360    } else {
     9361        g_renderer->setStreamlinesSeedPointSize("all", size);
     9362    }
     9363    return TCL_OK;
     9364}
     9365
     9366static int
    93509367StreamlinesSeedRakeOp(ClientData clientData, Tcl_Interp *interp, int objc,
    93519368                      Tcl_Obj *const *objv)
     
    94169433    {"points",  3, StreamlinesSeedPointsOp,        3, 4, "?dataSetName?"},
    94179434    {"polygon", 3, StreamlinesSeedPolygonOp,       12, 13, "centerX centerY centerZ normalX normalY normalZ angle radius numSides ?dataSetName?"},
     9435    {"ptsize",  2, StreamlinesSeedPointSizeOp,     3, 4, "size ?dataSetName?"},
    94189436    {"rake",    3, StreamlinesSeedRakeOp,          10, 11, "startX startY startZ endX endY endZ numPoints ?dataSetName?"},
    94199437    {"random",  3, StreamlinesSeedRandomOp,        4, 5, "numPoints ?dataSetName?"},
     
    94349452    }
    94359453    return (*proc) (clientData, interp, objc, objv);
     9454}
     9455
     9456static int
     9457StreamlinesTerminalSpeedOp(ClientData clientData, Tcl_Interp *interp, int objc,
     9458                           Tcl_Obj *const *objv)
     9459{
     9460    double speed;
     9461    if (Tcl_GetDoubleFromObj(interp, objv[2], &speed) != TCL_OK) {
     9462        return TCL_ERROR;
     9463    }
     9464    if (objc == 4) {
     9465        const char *name = Tcl_GetString(objv[3]);
     9466        g_renderer->setStreamlinesTerminalSpeed(name, speed);
     9467    } else {
     9468        g_renderer->setStreamlinesTerminalSpeed("all", speed);
     9469    }
     9470    return TCL_OK;
    94369471}
    94379472
     
    94929527    {"scale",        2, StreamlinesScaleOp,          5, 6, "sx sy sz ?dataSetName?"},
    94939528    {"seed",         2, StreamlinesSeedOp,           3, 14, "op params... ?dataSetName?"},
    9494     {"tubes",        1, StreamlinesTubesOp,          4, 5, "numSides radius ?dataSetName?"},
     9529    {"termspeed",    2, StreamlinesTerminalSpeedOp,  3, 4, "speed ?dataSetName?"},
     9530    {"tubes",        2, StreamlinesTubesOp,          4, 5, "numSides radius ?dataSetName?"},
    94959531    {"visible",      1, StreamlinesVisibleOp,        3, 4, "bool ?dataSetName?"}
    94969532};
  • trunk/packages/vizservers/vtkvis/RendererGraphicsObjs.cpp

    r3680 r3682  
    25372537
    25382538/**
    2539  * \brief Set the streamlines seed to points of the streamlines DataSet
    2540  */
    2541 void Renderer::setStreamlinesSeedToMeshPoints(const DataSetId& id)
     2539 * \brief Set the streamlines seed point size (may be a no-op)
     2540 */
     2541void Renderer::setStreamlinesSeedPointSize(const DataSetId& id, float size)
    25422542{
    25432543    StreamlinesHashmap::iterator itr;
     
    25592559
    25602560    do {
    2561         itr->second->setSeedToMeshPoints();
     2561        itr->second->setSeedPointSize(size);
     2562    } while (doAll && ++itr != _streamlines.end());
     2563
     2564    _needsRedraw = true;
     2565}
     2566
     2567/**
     2568 * \brief Set the streamlines seed to points of the streamlines DataSet
     2569 */
     2570void Renderer::setStreamlinesSeedToMeshPoints(const DataSetId& id,
     2571                                              int maxPoints)
     2572{
     2573    StreamlinesHashmap::iterator itr;
     2574
     2575    bool doAll = false;
     2576
     2577    if (id.compare("all") == 0) {
     2578        itr = _streamlines.begin();
     2579        if (itr == _streamlines.end())
     2580            return;
     2581        doAll = true;
     2582    } else {
     2583        itr = _streamlines.find(id);
     2584    }
     2585    if (itr == _streamlines.end()) {
     2586        ERROR("Streamlines not found: %s", id.c_str());
     2587        return;
     2588    }
     2589
     2590    do {
     2591        itr->second->setSeedToMeshPoints(maxPoints);
    25622592    } while (doAll && ++itr != _streamlines.end());
    25632593
     
    26072637 */
    26082638bool Renderer::setStreamlinesSeedToMeshPoints(const DataSetId& id,
    2609                                               char *data, size_t nbytes)
     2639                                              char *data, size_t nbytes,
     2640                                              int maxPoints)
    26102641{
    26112642    vtkSmartPointer<vtkDataSetReader> reader = vtkSmartPointer<vtkDataSetReader>::New();
     
    26402671
    26412672    do {
    2642         itr->second->setSeedToMeshPoints(dataSet);
     2673        itr->second->setSeedToMeshPoints(dataSet, maxPoints);
    26432674    } while (doAll && ++itr != _streamlines.end());
    26442675
     
    28362867}
    28372868
     2869void Renderer::setStreamlinesTerminalSpeed(const DataSetId& id, double speed)
     2870{
     2871    StreamlinesHashmap::iterator itr;
     2872
     2873    bool doAll = false;
     2874
     2875    if (id.compare("all") == 0) {
     2876        itr = _streamlines.begin();
     2877        if (itr == _streamlines.end())
     2878            return;
     2879        doAll = true;
     2880    } else {
     2881        itr = _streamlines.find(id);
     2882    }
     2883    if (itr == _streamlines.end()) {
     2884        ERROR("Streamlines not found: %s", id.c_str());
     2885        return;
     2886    }
     2887
     2888    do {
     2889        itr->second->setTerminalSpeed(speed);
     2890    } while (doAll && ++itr != _streamlines.end());
     2891
     2892    sceneBoundsChanged();
     2893    _needsRedraw = true;
     2894}
     2895
    28382896/**
    28392897 * \brief Set Streamlines rendering to polylines for the specified DataSet
  • trunk/packages/vizservers/vtkvis/Streamlines.cpp

    r3680 r3682  
    3232#include <vtkTransformPolyDataFilter.h>
    3333#include <vtkVertexGlyphFilter.h>
     34#include <vtkMaskPoints.h>
    3435
    3536#include "Streamlines.h"
     
    611612    _streamTracer->Update();
    612613    vtkPolyData *pd = _streamTracer->GetOutput();
    613     TRACE("Verts: %d Lines: %d Polys: %d Strips: %d",
     614    DataSet::print(pd);
     615    TRACE("Points: %d Verts: %d Lines: %d Polys: %d Strips: %d",
     616          pd->GetNumberOfPoints(),
    614617          pd->GetNumberOfVerts(),
    615618          pd->GetNumberOfLines(),
    616619          pd->GetNumberOfPolys(),
    617620          pd->GetNumberOfStrips());
     621#if 0
    618622    vtkCellArray *arr = pd->GetLines();
    619623    arr->InitTraversal();
     
    624628    }
    625629#endif
     630#endif
    626631
    627632    initProp();
     
    657662        }
    658663        break;
     664    case DATASET_MESH_POINTS:
     665        setSeedToMeshPoints(numPoints);
     666        break;
     667    case MESH_POINTS:
     668        setSeedToMeshPoints(_seedMesh, numPoints);
     669        break;
    659670    default:
    660671        ERROR("Can't set number of points for seed type %d", _seedType);
     
    669680 * Streamlines as seeds
    670681 */
    671 void Streamlines::setSeedToMeshPoints()
     682void Streamlines::setSeedToMeshPoints(int maxPoints)
    672683{
    673684    _seedType = DATASET_MESH_POINTS;
    674     setSeedToMeshPoints(_dataSet->getVtkDataSet());
     685    setSeedToMeshPoints(_dataSet->getVtkDataSet(), maxPoints);
    675686}
    676687
     
    696707 * \param[in] seed vtkDataSet with points to use as seeds
    697708 */
    698 void Streamlines::setSeedToMeshPoints(vtkDataSet *seed)
     709void Streamlines::setSeedToMeshPoints(vtkDataSet *seed, int maxPoints)
    699710{
    700711    if (seed != _dataSet->getVtkDataSet()) {
    701712        _seedType = MESH_POINTS;
    702     }
    703     _seedMesh = NULL;
    704     if (_streamTracer != NULL) {
     713        _seedMesh = seed;
     714    } else {
     715        _seedType = DATASET_MESH_POINTS;
     716        _seedMesh = NULL;
     717    }
     718
     719    if (_streamTracer == NULL)
     720        return;
     721
     722#ifndef USE_VTK6
     723    vtkSmartPointer<vtkDataSet> oldSeed;
     724    if (_streamTracer->GetSource() != NULL) {
     725        oldSeed = _streamTracer->GetSource();
     726    }
     727#endif
     728
     729    if (maxPoints > 0 && seed->GetNumberOfPoints() > maxPoints) {
     730        TRACE("Seed points: %d", maxPoints);
     731        vtkSmartPointer<vtkMaskPoints> mask = vtkSmartPointer<vtkMaskPoints>::New();
     732#ifdef USE_VTK6
     733        mask->SetInputData(seed);
     734#else
     735        mask->SetInput(seed);
     736#endif
     737        mask->SetMaximumNumberOfPoints(maxPoints);
     738        mask->RandomModeOn();
     739        mask->GenerateVerticesOff();
     740        _streamTracer->SetSourceConnection(mask->GetOutputPort());
     741
     742        vtkSmartPointer<vtkVertexGlyphFilter> vertFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
     743        vertFilter->SetInputConnection(mask->GetOutputPort());
     744        _seedMapper->SetInputConnection(vertFilter->GetOutputPort());
     745    } else {
    705746        TRACE("Seed points: %d", seed->GetNumberOfPoints());
    706         vtkSmartPointer<vtkDataSet> oldSeed;
    707         if (_streamTracer->GetSource() != NULL) {
    708             oldSeed = _streamTracer->GetSource();
    709         }
    710747
    711748#ifdef USE_VTK6
     
    713750#else
    714751        _streamTracer->SetSource(seed);
    715 
    716         if (oldSeed != NULL) {
    717             oldSeed->SetPipelineInformation(NULL);
    718         }
    719752#endif
    720753        if (vtkPolyData::SafeDownCast(seed) != NULL) {
     
    734767        }
    735768    }
     769
     770#ifndef USE_VTK6
     771    if (oldSeed != NULL) {
     772        oldSeed->SetPipelineInformation(NULL);
     773    }
     774#endif
    736775}
    737776
     
    17671806
    17681807/**
     1808 * \brief Set point size of seed geometry (may be a no-op)
     1809 */
     1810void Streamlines::setSeedPointSize(float size)
     1811{
     1812    if (_seedActor != NULL) {
     1813        _seedActor->GetProperty()->SetPointSize(size);
     1814    }
     1815}
     1816
     1817/**
    17691818 * \brief Set pixel width of stream lines (may be a no-op)
    17701819 */
  • trunk/packages/vizservers/vtkvis/Streamlines.h

    r3680 r3682  
    100100    void setNumberOfSeedPoints(int numPoints);
    101101
    102     void setSeedToMeshPoints();
     102    void setSeedToMeshPoints(int maxPoints = 500);
    103103
    104104    void setSeedToFilledMesh(int numPoints);
    105105
    106     void setSeedToMeshPoints(vtkDataSet *ds);
     106    void setSeedToMeshPoints(vtkDataSet *ds, int maxPoints = 500);
    107107
    108108    void setSeedToFilledMesh(vtkDataSet *ds, int numPoints);
     
    172172
    173173    void setSeedColor(float color[3]);
     174
     175    void setSeedPointSize(float size);
    174176
    175177private:
  • trunk/packages/vizservers/vtkvis/protocol.txt

    r3680 r3682  
    728728            Use points of a mesh supplied as a VTK data file
    729729streamlines seed numpts <?datasetName?>
    730             If seeds have been created using 'seed random' or 'seed fmesh',
    731             this command can be used to change the number of randomly
    732             distributed seeds
     730            If seeds have been created using 'seed random', 'seed fmesh',
     731            'seed mesh' or 'seed points' this command can be used to change the
     732            number of randomly distributed seeds.  In the case of 'seed mesh'
     733            or 'seed points', the number is the maximum number of points of the
     734            mesh to be used -- the actual number may be fewer if the mesh
     735            contains fewer points.  Set to a number less than 0 to use all the
     736            points of the mesh.
    733737streamlines seed points <?datasetName?>
    734738            Use points of the streamlines' dataset mesh
    735739streamlines seed polygon <centerX> <centerY> <centerZ> <normalX> <normalY> <normalZ> <angle> <radius> <numSides> <?dataSetName?>
    736740            Create seed points from vertices of a regular n-sided polygon
     741streamlines seed ptsize <size> <?datasetName?>
     742            Set the point size for rendering seed points
    737743streamlines seed rake <startX> <startY> <startZ> <endX> <endY> <endZ> <numPoints> <?datasetName?>
    738744streamlines seed random <numPoints> <?datasetName?>
Note: See TracChangeset for help on using the changeset viewer.