- Timestamp:
- Jan 9, 2012, 1:27:10 AM (13 years ago)
- Location:
- trunk/packages/vizservers/vtkvis
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/packages/vizservers/vtkvis/RpCutplane.cpp
r2752 r2757 221 221 splatter->GetSampleDimensions(dims); 222 222 TRACE("Sample dims: %d %d %d", dims[0], dims[1], dims[2]); 223 if (plane == DataSet::PLANE_ZY) {223 if (plane == PLANE_ZY) { 224 224 dims[0] = 3; 225 } else if (plane == DataSet::PLANE_XZ) {225 } else if (plane == PLANE_XZ) { 226 226 dims[1] = 3; 227 227 } else { … … 255 255 splatter->SetInput(pd); 256 256 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); 259 261 for (int i = 0; i < 3; i++) { 260 262 _cutter[i]->SetInputConnection(splatter->GetOutputPort()); -
trunk/packages/vizservers/vtkvis/RpVolume.cpp
r2641 r2757 20 20 #include <vtkProjectedTetrahedraMapper.h> 21 21 #include <vtkDataSetTriangleFilter.h> 22 #include <vtkGaussianSplatter.h> 22 23 23 24 #include "RpVolume.h" … … 54 55 55 56 /** 57 * \brief Get the voxel dimensions (if the volume is not a 58 * uniform grid, unit spacing is returned) 59 */ 60 void 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 */ 80 double Volume::getAverageSpacing() 81 { 82 double spacing[3]; 83 getSpacing(spacing); 84 return (spacing[0] + spacing[1] + spacing[2]) * 0.333; 85 } 86 87 /** 56 88 * \brief Internal method to set up pipeline after a state change 57 89 */ … … 62 94 63 95 vtkDataSet *ds = _dataSet->getVtkDataSet(); 96 97 if (_dataSet->is2D()) { 98 ERROR("Volume requires a 3D DataSet"); 99 _dataSet = NULL; 100 return; 101 } 64 102 65 103 if (vtkImageData::SafeDownCast(ds) != NULL) { … … 67 105 #ifdef USE_GPU_RAYCAST_MAPPER 68 106 _volumeMapper = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New(); 107 vtkGPUVolumeRayCastMapper::SafeDownCast(_volumeMapper)->AutoAdjustSampleDistancesOff(); 69 108 #else 70 109 _volumeMapper = vtkSmartPointer<vtkVolumeTextureMapper3D>::New(); 71 110 #endif 72 111 _volumeMapper->SetInput(ds); 73 vtkVolumeMapper::SafeDownCast(_volumeMapper)->SetBlendModeToComposite(); 112 vtkVolumeMapper::SafeDownCast(_volumeMapper)->SetBlendModeToComposite(); 74 113 } else if (vtkUnstructuredGrid::SafeDownCast(ds) != NULL) { 75 114 vtkUnstructuredGrid *ugrid = vtkUnstructuredGrid::SafeDownCast(ds); … … 93 132 vtkUnstructuredGridVolumeMapper::SafeDownCast(_volumeMapper)-> 94 133 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(); 95 154 } else { 96 155 ERROR("Unsupported DataSet type: %s", _dataSet->getVtkType()); … … 111 170 setColorMap(ColorMap::getVolumeDefault()); 112 171 } 172 173 setSampleDistance(getAverageSpacing()); 113 174 114 175 getVolume()->SetMapper(_volumeMapper); … … 182 243 } 183 244 } 245 246 /** 247 * \brief Set distance between samples along rays 248 */ 249 void 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 43 43 } 44 44 45 void getSpacing(double spacing[3]); 46 47 double getAverageSpacing(); 48 45 49 virtual void setOpacity(double opacity); 46 50 … … 54 58 55 59 virtual void updateRanges(Renderer *renderer); 60 61 void setSampleDistance(float d); 56 62 57 63 private: -
trunk/packages/vizservers/vtkvis/RpVtkRenderer.h
r2752 r2757 515 515 void setStreamlinesSeedColor(const DataSetId& id, float color[3]); 516 516 517 // Volumes 518 519 void setVolumeSampleDistance(const DataSetId& id, double distance); 520 517 521 private: 518 522 static void printCameraInfo(vtkCamera *camera); -
trunk/packages/vizservers/vtkvis/RpVtkRendererCmd.cpp
r2752 r2757 1652 1652 {"ccolor", 2, CutplaneColorOp, 5, 6, "r g b ?dataSetName?"}, 1653 1653 {"colormap", 7, CutplaneColorMapOp, 3, 4, "colorMapName ?dataSetName?"}, 1654 {"colormode", 7, CutplaneColorModeOp, 4, 5, "mode fieldName ?dataSetN me?"},1654 {"colormode", 7, CutplaneColorModeOp, 4, 5, "mode fieldName ?dataSetName?"}, 1655 1655 {"delete", 1, CutplaneDeleteOp, 2, 3, "?dataSetName?"}, 1656 1656 {"edges", 1, CutplaneEdgeVisibilityOp, 3, 4, "bool ?dataSetName?"}, … … 2521 2521 2522 2522 static Rappture::CmdSpec glyphsOps[] = { 2523 {"add", 1, GlyphsAddOp, 3, 4, "shape ?dataSetN me?"},2523 {"add", 1, GlyphsAddOp, 3, 4, "shape ?dataSetName?"}, 2524 2524 {"ccolor", 2, GlyphsColorOp, 5, 6, "r g b ?dataSetName?"}, 2525 {"colormap", 7, GlyphsColorMapOp, 3, 4, "colorMapName ?dataSetN me?"},2526 {"colormode", 7, GlyphsColorModeOp, 4, 5, "mode fieldName ?dataSetN me?"},2525 {"colormap", 7, GlyphsColorMapOp, 3, 4, "colorMapName ?dataSetName?"}, 2526 {"colormode", 7, GlyphsColorModeOp, 4, 5, "mode fieldName ?dataSetName?"}, 2527 2527 {"delete", 1, GlyphsDeleteOp, 2, 3, "?dataSetName?"}, 2528 2528 {"edges", 1, GlyphsEdgeVisibilityOp, 3, 4, "bool ?dataSetName?"}, … … 2537 2537 {"scale", 2, GlyphsScaleOp, 5, 6, "sx sy sz ?dataSetName?"}, 2538 2538 {"shape", 2, GlyphsShapeOp, 3, 4, "shapeVal ?dataSetName?"}, 2539 {"smode", 2, GlyphsScalingModeOp, 4, 5, "mode fieldName ?dataSetN me?"},2539 {"smode", 2, GlyphsScalingModeOp, 4, 5, "mode fieldName ?dataSetName?"}, 2540 2540 {"visible", 1, GlyphsVisibleOp, 3, 4, "bool ?dataSetName?"}, 2541 2541 {"wireframe", 1, GlyphsWireframeOp, 3, 4, "bool ?dataSetName?"} … … 4315 4315 {"add", 1, PseudoColorAddOp, 2, 3, "?dataSetName?"}, 4316 4316 {"ccolor", 2, PseudoColorColorOp, 5, 6, "r g b ?dataSetName?"}, 4317 {"colormap", 7, PseudoColorColorMapOp, 3, 4, "colorMapName ?dataSetN me?"},4318 {"colormode", 7, PseudoColorColorModeOp, 4, 5, "mode fieldName ?dataSetN me?"},4317 {"colormap", 7, PseudoColorColorMapOp, 3, 4, "colorMapName ?dataSetName?"}, 4318 {"colormode", 7, PseudoColorColorModeOp, 4, 5, "mode fieldName ?dataSetName?"}, 4319 4319 {"delete", 1, PseudoColorDeleteOp, 2, 3, "?dataSetName?"}, 4320 4320 {"edges", 1, PseudoColorEdgeVisibilityOp, 3, 4, "bool ?dataSetName?"}, … … 5164 5164 {"ccolor", 1, StreamlinesColorOp, 5, 6, "r g b ?dataSetName?"}, 5165 5165 {"colormap", 7, StreamlinesColorMapOp, 3, 4, "colorMapName ?dataSetName?"}, 5166 {"colormode", 7, StreamlinesColorModeOp, 4, 5, "mode fieldName ?dataSetN me?"},5166 {"colormode", 7, StreamlinesColorModeOp, 4, 5, "mode fieldName ?dataSetName?"}, 5167 5167 {"delete", 1, StreamlinesDeleteOp, 2, 3, "?dataSetName?"}, 5168 5168 {"edges", 1, StreamlinesEdgeVisibilityOp, 3, 4, "bool ?dataSetName?"}, … … 5317 5317 5318 5318 static int 5319 VolumeSampleRateOp(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 5348 static int 5319 5349 VolumeScaleOp(ClientData clientData, Tcl_Interp *interp, int objc, 5320 5350 Tcl_Obj *const *objv) … … 5429 5459 5430 5460 static 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?"} 5441 5472 }; 5442 5473 static int nVolumeOps = NumCmdSpecs(volumeOps); -
trunk/packages/vizservers/vtkvis/RpVtkRendererGraphicsObjs.cpp
r2752 r2757 1709 1709 _needsRedraw = true; 1710 1710 } 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 */ 1718 void 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 366 366 volume orient <qw> <qx> <qy> <qz> <?dataSetName?> 367 367 volume pos <x> <y> <z> <?dataSetName?> 368 volume quality <val> <?datasetName?> 369 val = [0,1] 368 370 volume scale <sx> <sy> <sz> <?dataSetName?> 369 371 volume shading ambient <coeff> <?datasetName?>
Note: See TracChangeset
for help on using the changeset viewer.