Changeset 2757 for trunk


Ignore:
Timestamp:
Jan 9, 2012, 1:27:10 AM (13 years ago)
Author:
ldelgass
Message:

Add volume quality command to adjust relative sampling distance (quality is in
[0,1] range and is used to adjust sample distance relative to volume spacing.
Also first pass at supporting point cloud input to volume renderer.

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

Legend:

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

    r2752 r2757  
    221221            splatter->GetSampleDimensions(dims);
    222222            TRACE("Sample dims: %d %d %d", dims[0], dims[1], dims[2]);
    223             if (plane == DataSet::PLANE_ZY) {
     223            if (plane == PLANE_ZY) {
    224224                dims[0] = 3;
    225             } else if (plane == DataSet::PLANE_XZ) {
     225            } else if (plane == PLANE_XZ) {
    226226                dims[1] = 3;
    227227            } else {
     
    255255            splatter->SetInput(pd);
    256256            int dims[3];
    257             splatter->GetSampleDimensions(dims);
    258             TRACE("Sample dims: %d %d %d", dims[0], dims[1], dims[2]);
     257            dims[0] = dims[1] = dims[2] = 64;
     258            TRACE("Generating volume with dims (%d,%d,%d) from point cloud",
     259                  dims[0], dims[1], dims[2]);
     260            splatter->SetSampleDimensions(dims);
    259261            for (int i = 0; i < 3; i++) {
    260262                _cutter[i]->SetInputConnection(splatter->GetOutputPort());
  • trunk/packages/vizservers/vtkvis/RpVolume.cpp

    r2641 r2757  
    2020#include <vtkProjectedTetrahedraMapper.h>
    2121#include <vtkDataSetTriangleFilter.h>
     22#include <vtkGaussianSplatter.h>
    2223
    2324#include "RpVolume.h"
     
    5455
    5556/**
     57 * \brief Get the voxel dimensions (if the volume is not a
     58 * uniform grid, unit spacing is returned)
     59 */
     60void Volume::getSpacing(double spacing[3])
     61{
     62    spacing[0] = spacing[1] = spacing[2] = 1.0;
     63    if (_dataSet == NULL)
     64        return;
     65    vtkDataSet *ds = _dataSet->getVtkDataSet();
     66    if (ds != NULL && vtkImageData::SafeDownCast(ds) != NULL) {
     67        vtkImageData::SafeDownCast(ds)->GetSpacing(spacing);
     68    } else if (ds != NULL && vtkVolumeMapper::SafeDownCast(_volumeMapper) != NULL) {
     69        vtkImageData *imgData = vtkVolumeMapper::SafeDownCast(_volumeMapper)->GetInput();
     70        if (imgData != NULL) {
     71            imgData->GetSpacing(spacing);
     72        }
     73    }
     74}
     75
     76/**
     77 * \brief Get the average voxel dimension (if the volume is not a
     78 * uniform grid, unit spacing is returned)
     79 */
     80double Volume::getAverageSpacing()
     81{
     82    double spacing[3];
     83    getSpacing(spacing);
     84    return (spacing[0] + spacing[1] + spacing[2]) * 0.333;
     85}
     86
     87/**
    5688 * \brief Internal method to set up pipeline after a state change
    5789 */
     
    6294
    6395    vtkDataSet *ds = _dataSet->getVtkDataSet();
     96
     97    if (_dataSet->is2D()) {
     98        ERROR("Volume requires a 3D DataSet");
     99        _dataSet = NULL;
     100        return;
     101    }
    64102
    65103    if (vtkImageData::SafeDownCast(ds) != NULL) {
     
    67105#ifdef USE_GPU_RAYCAST_MAPPER
    68106        _volumeMapper = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
     107        vtkGPUVolumeRayCastMapper::SafeDownCast(_volumeMapper)->AutoAdjustSampleDistancesOff();
    69108#else
    70109        _volumeMapper = vtkSmartPointer<vtkVolumeTextureMapper3D>::New();
    71110#endif
    72111        _volumeMapper->SetInput(ds);
    73         vtkVolumeMapper::SafeDownCast(_volumeMapper)->SetBlendModeToComposite();       
     112        vtkVolumeMapper::SafeDownCast(_volumeMapper)->SetBlendModeToComposite();
    74113    } else if (vtkUnstructuredGrid::SafeDownCast(ds) != NULL) {
    75114        vtkUnstructuredGrid *ugrid = vtkUnstructuredGrid::SafeDownCast(ds);
     
    93132        vtkUnstructuredGridVolumeMapper::SafeDownCast(_volumeMapper)->
    94133            SetBlendModeToComposite();
     134    } else if (vtkPolyData::SafeDownCast(ds) != NULL &&
     135               vtkPolyData::SafeDownCast(ds)->GetNumberOfLines() == 0 &&
     136               vtkPolyData::SafeDownCast(ds)->GetNumberOfPolys() == 0 &&
     137               vtkPolyData::SafeDownCast(ds)->GetNumberOfStrips() == 0 ) {
     138        // DataSet is a 3D point cloud
     139        vtkSmartPointer<vtkGaussianSplatter> splatter = vtkSmartPointer<vtkGaussianSplatter>::New();
     140        splatter->SetInput(ds);
     141        int dims[3];
     142        dims[0] = dims[1] = dims[2] = 64;
     143        TRACE("Generating volume with dims (%d,%d,%d) from point cloud",
     144              dims[0], dims[1], dims[2]);
     145        splatter->SetSampleDimensions(dims);
     146#ifdef USE_GPU_RAYCAST_MAPPER
     147        _volumeMapper = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
     148        vtkGPUVolumeRayCastMapper::SafeDownCast(_volumeMapper)->AutoAdjustSampleDistancesOff();
     149#else
     150        _volumeMapper = vtkSmartPointer<vtkVolumeTextureMapper3D>::New();
     151#endif
     152        _volumeMapper->SetInputConnection(splatter->GetOutputPort());
     153        vtkVolumeMapper::SafeDownCast(_volumeMapper)->SetBlendModeToComposite();
    95154    } else {
    96155        ERROR("Unsupported DataSet type: %s", _dataSet->getVtkType());
     
    111170        setColorMap(ColorMap::getVolumeDefault());
    112171    }
     172
     173    setSampleDistance(getAverageSpacing());
    113174
    114175    getVolume()->SetMapper(_volumeMapper);
     
    182243    }
    183244}
     245
     246/**
     247 * \brief Set distance between samples along rays
     248 */
     249void Volume::setSampleDistance(float d)
     250{
     251    TRACE("Sample distance: %g", d);
     252    if (_volumeMapper != NULL &&
     253#ifdef USE_GPU_RAYCAST_MAPPER
     254        vtkGPUVolumeRayCastMapper::SafeDownCast(_volumeMapper) != NULL) {
     255        vtkGPUVolumeRayCastMapper::SafeDownCast(_volumeMapper)->SetSampleDistance(d);
     256#else
     257        vtkVolumeTextureMapper3D::SafeDownCast(_volumeMapper) != NULL) {
     258        vtkVolumeTextureMapper3D::SafeDownCast(_volumeMapper)->SetSampleDistance(d);
     259#endif
     260    }
     261}
  • trunk/packages/vizservers/vtkvis/RpVolume.h

    r2612 r2757  
    4343    }
    4444
     45    void getSpacing(double spacing[3]);
     46
     47    double getAverageSpacing();
     48
    4549    virtual void setOpacity(double opacity);
    4650
     
    5458
    5559    virtual void updateRanges(Renderer *renderer);
     60
     61    void setSampleDistance(float d);
    5662
    5763private:
  • trunk/packages/vizservers/vtkvis/RpVtkRenderer.h

    r2752 r2757  
    515515    void setStreamlinesSeedColor(const DataSetId& id, float color[3]);
    516516
     517    // Volumes
     518
     519    void setVolumeSampleDistance(const DataSetId& id, double distance);
     520
    517521private:
    518522    static void printCameraInfo(vtkCamera *camera);
  • trunk/packages/vizservers/vtkvis/RpVtkRendererCmd.cpp

    r2752 r2757  
    16521652    {"ccolor",       2, CutplaneColorOp, 5, 6, "r g b ?dataSetName?"},
    16531653    {"colormap",     7, CutplaneColorMapOp, 3, 4, "colorMapName ?dataSetName?"},
    1654     {"colormode",    7, CutplaneColorModeOp, 4, 5, "mode fieldName ?dataSetNme?"},
     1654    {"colormode",    7, CutplaneColorModeOp, 4, 5, "mode fieldName ?dataSetName?"},
    16551655    {"delete",       1, CutplaneDeleteOp, 2, 3, "?dataSetName?"},
    16561656    {"edges",        1, CutplaneEdgeVisibilityOp, 3, 4, "bool ?dataSetName?"},
     
    25212521
    25222522static Rappture::CmdSpec glyphsOps[] = {
    2523     {"add",       1, GlyphsAddOp, 3, 4, "shape ?dataSetNme?"},
     2523    {"add",       1, GlyphsAddOp, 3, 4, "shape ?dataSetName?"},
    25242524    {"ccolor",    2, GlyphsColorOp, 5, 6, "r g b ?dataSetName?"},
    2525     {"colormap",  7, GlyphsColorMapOp, 3, 4, "colorMapName ?dataSetNme?"},
    2526     {"colormode", 7, GlyphsColorModeOp, 4, 5, "mode fieldName ?dataSetNme?"},
     2525    {"colormap",  7, GlyphsColorMapOp, 3, 4, "colorMapName ?dataSetName?"},
     2526    {"colormode", 7, GlyphsColorModeOp, 4, 5, "mode fieldName ?dataSetName?"},
    25272527    {"delete",    1, GlyphsDeleteOp, 2, 3, "?dataSetName?"},
    25282528    {"edges",     1, GlyphsEdgeVisibilityOp, 3, 4, "bool ?dataSetName?"},
     
    25372537    {"scale",     2, GlyphsScaleOp, 5, 6, "sx sy sz ?dataSetName?"},
    25382538    {"shape",     2, GlyphsShapeOp, 3, 4, "shapeVal ?dataSetName?"},
    2539     {"smode",     2, GlyphsScalingModeOp, 4, 5, "mode fieldName ?dataSetNme?"},
     2539    {"smode",     2, GlyphsScalingModeOp, 4, 5, "mode fieldName ?dataSetName?"},
    25402540    {"visible",   1, GlyphsVisibleOp, 3, 4, "bool ?dataSetName?"},
    25412541    {"wireframe", 1, GlyphsWireframeOp, 3, 4, "bool ?dataSetName?"}
     
    43154315    {"add",       1, PseudoColorAddOp, 2, 3, "?dataSetName?"},
    43164316    {"ccolor",    2, PseudoColorColorOp, 5, 6, "r g b ?dataSetName?"},
    4317     {"colormap",  7, PseudoColorColorMapOp, 3, 4, "colorMapName ?dataSetNme?"},
    4318     {"colormode", 7, PseudoColorColorModeOp, 4, 5, "mode fieldName ?dataSetNme?"},
     4317    {"colormap",  7, PseudoColorColorMapOp, 3, 4, "colorMapName ?dataSetName?"},
     4318    {"colormode", 7, PseudoColorColorModeOp, 4, 5, "mode fieldName ?dataSetName?"},
    43194319    {"delete",    1, PseudoColorDeleteOp, 2, 3, "?dataSetName?"},
    43204320    {"edges",     1, PseudoColorEdgeVisibilityOp, 3, 4, "bool ?dataSetName?"},
     
    51645164    {"ccolor",    1, StreamlinesColorOp,          5, 6, "r g b ?dataSetName?"},
    51655165    {"colormap",  7, StreamlinesColorMapOp,       3, 4, "colorMapName ?dataSetName?"},
    5166     {"colormode", 7, StreamlinesColorModeOp,      4, 5, "mode fieldName ?dataSetNme?"},
     5166    {"colormode", 7, StreamlinesColorModeOp,      4, 5, "mode fieldName ?dataSetName?"},
    51675167    {"delete",    1, StreamlinesDeleteOp,         2, 3, "?dataSetName?"},
    51685168    {"edges",     1, StreamlinesEdgeVisibilityOp, 3, 4, "bool ?dataSetName?"},
     
    53175317
    53185318static int
     5319VolumeSampleRateOp(ClientData clientData, Tcl_Interp *interp, int objc,
     5320                   Tcl_Obj *const *objv)
     5321{
     5322    double quality;
     5323    if (Tcl_GetDoubleFromObj(interp, objv[2], &quality) != TCL_OK) {
     5324        return TCL_ERROR;
     5325    }
     5326    if (quality < 0.0 || quality > 1.0) {
     5327        Tcl_AppendResult(interp, "bad volume quality value \"",
     5328                         Tcl_GetString(objv[2]),
     5329                         "\": should be in the range [0,1]", (char*)NULL);
     5330        return TCL_ERROR;
     5331    }
     5332    double distance;
     5333    double maxFactor = 4.0;
     5334    if (quality >= 0.5) {
     5335        distance = 1.0 / ((quality - 0.5) * (maxFactor - 1.0) * 2.0 + 1.0);
     5336    } else {
     5337        distance = ((0.5 - quality) * (maxFactor - 1.0) * 2.0 + 1.0);
     5338    }
     5339    if (objc == 4) {
     5340        const char *name = Tcl_GetString(objv[3]);
     5341        g_renderer->setVolumeSampleDistance(name, distance);
     5342    } else {
     5343        g_renderer->setVolumeSampleDistance("all", distance);
     5344    }
     5345    return TCL_OK;
     5346}
     5347
     5348static int
    53195349VolumeScaleOp(ClientData clientData, Tcl_Interp *interp, int objc,
    53205350              Tcl_Obj *const *objv)
     
    54295459
    54305460static Rappture::CmdSpec volumeOps[] = {
    5431     {"add",      1, VolumeAddOp,      2, 3, "?dataSetName?"},
    5432     {"colormap", 1, VolumeColorMapOp, 3, 4, "colorMapName ?dataSetName?"},
    5433     {"delete",   1, VolumeDeleteOp,   2, 3, "?dataSetName?"},
    5434     {"lighting", 1, VolumeLightingOp, 3, 4, "bool ?dataSetName?"},
    5435     {"opacity",  2, VolumeOpacityOp,  3, 4, "val ?dataSetName?"},
    5436     {"orient",   2, VolumeOrientOp,   6, 7, "qw qx qy qz ?dataSetName?"},
    5437     {"pos",      1, VolumePositionOp, 5, 6, "x y z ?dataSetName?"},
    5438     {"scale",    2, VolumeScaleOp,    5, 6, "sx sy sz ?dataSetName?"},
    5439     {"shading",  2, VolumeShadingOp,  4, 6, "oper val ?dataSetName?"},
    5440     {"visible",  1, VolumeVisibleOp,  3, 4, "bool ?dataSetName?"}
     5461    {"add",      1, VolumeAddOp,        2, 3, "?dataSetName?"},
     5462    {"colormap", 1, VolumeColorMapOp,   3, 4, "colorMapName ?dataSetName?"},
     5463    {"delete",   1, VolumeDeleteOp,     2, 3, "?dataSetName?"},
     5464    {"lighting", 1, VolumeLightingOp,   3, 4, "bool ?dataSetName?"},
     5465    {"opacity",  2, VolumeOpacityOp,    3, 4, "val ?dataSetName?"},
     5466    {"orient",   2, VolumeOrientOp,     6, 7, "qw qx qy qz ?dataSetName?"},
     5467    {"pos",      1, VolumePositionOp,   5, 6, "x y z ?dataSetName?"},
     5468    {"quality",  1, VolumeSampleRateOp, 3, 4, "val ?dataSetName?"},
     5469    {"scale",    2, VolumeScaleOp,      5, 6, "sx sy sz ?dataSetName?"},
     5470    {"shading",  2, VolumeShadingOp,    4, 6, "oper val ?dataSetName?"},
     5471    {"visible",  1, VolumeVisibleOp,    3, 4, "bool ?dataSetName?"}
    54415472};
    54425473static int nVolumeOps = NumCmdSpecs(volumeOps);
  • trunk/packages/vizservers/vtkvis/RpVtkRendererGraphicsObjs.cpp

    r2752 r2757  
    17091709    _needsRedraw = true;
    17101710}
     1711
     1712/**
     1713 * \brief Set the sample rate for the volume shader
     1714 *
     1715 * Smaller values will give better rendering at the cost
     1716 * of slower rendering
     1717 */
     1718void Renderer::setVolumeSampleDistance(const DataSetId& id, double distance)
     1719{
     1720    VolumeHashmap::iterator itr;
     1721
     1722    bool doAll = false;
     1723
     1724    if (id.compare("all") == 0) {
     1725        itr = _volumes.begin();
     1726        doAll = true;
     1727    } else {
     1728        itr = _volumes.find(id);
     1729    }
     1730    if (itr == _volumes.end()) {
     1731        ERROR("Volume not found: %s", id.c_str());
     1732        return;
     1733    }
     1734
     1735    do {
     1736        distance *= itr->second->getAverageSpacing();
     1737        itr->second->setSampleDistance((float)distance);
     1738    } while (doAll && ++itr != _volumes.end());
     1739
     1740    _needsRedraw = true;
     1741}
  • trunk/packages/vizservers/vtkvis/protocol.txt

    r2752 r2757  
    366366volume orient <qw> <qx> <qy> <qz> <?dataSetName?>
    367367volume pos <x> <y> <z> <?dataSetName?>
     368volume quality <val> <?datasetName?>
     369       val = [0,1]
    368370volume scale <sx> <sy> <sz> <?dataSetName?>
    369371volume shading ambient <coeff> <?datasetName?>
Note: See TracChangeset for help on using the changeset viewer.