source: branches/blt4/packages/vizservers/vtkvis/RpVtkRenderer.h @ 2742

Last change on this file since 2742 was 2742, checked in by gah, 13 years ago

sync with trunk

File size: 19.5 KB
RevLine 
[2120]1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 * Copyright (C) 2011, Purdue Research Foundation
4 *
5 * Author: Leif Delgass <ldelgass@purdue.edu>
6 */
7
8#ifndef __RAPPTURE_VTKVIS_RENDERER_H__
9#define __RAPPTURE_VTKVIS_RENDERER_H__
10
[2681]11#include <string>
12#include <vector>
13#include <tr1/unordered_map>
14#include <typeinfo>
15
[2120]16#include <vtkSmartPointer.h>
17#include <vtkCubeAxesActor.h>
18#ifdef USE_CUSTOM_AXES
[2542]19#include "vtkRpCubeAxesActor2D.h"
[2120]20#else
21#include <vtkCubeAxesActor2D.h>
22#endif
23#include <vtkScalarBarActor.h>
24#include <vtkRenderer.h>
25#include <vtkRenderWindow.h>
26#include <vtkUnsignedCharArray.h>
27
28#include "ColorMap.h"
[2681]29#include "RpTypes.h"
[2120]30#include "RpVtkDataSet.h"
31#include "RpContour2D.h"
[2302]32#include "RpContour3D.h"
[2550]33#include "RpCutplane.h"
[2302]34#include "RpGlyphs.h"
35#include "RpHeightMap.h"
[2322]36#include "RpLIC.h"
37#include "RpMolecule.h"
[2120]38#include "RpPolyData.h"
[2302]39#include "RpPseudoColor.h"
[2322]40#include "RpStreamlines.h"
[2302]41#include "RpVolume.h"
42#include "Trace.h"
[2120]43
[2302]44// Controls if TGA format is sent to client
45//#define RENDER_TARGA
46#define TARGA_BYTES_PER_PIXEL 3
47
[2120]48namespace Rappture {
49namespace VtkVis {
50
51/**
52 * \brief VTK Renderer
53 */
54class Renderer
55{
56public:
57    Renderer();
58    virtual ~Renderer();
59
[2302]60    enum AxesFlyMode {
61        FLY_OUTER_EDGES = 0,
62        FLY_CLOSEST_TRIAD,
63        FLY_FURTHEST_TRIAD,
64        FLY_STATIC_EDGES,
65        FLY_STATIC_TRIAD
66    };
67
[2409]68    enum AxesTickPosition {
69        TICKS_INSIDE,
70        TICKS_OUTSIDE,
71        TICKS_BOTH
72    };
73
[2120]74    enum CameraMode {
75        PERSPECTIVE,
76        ORTHO,
77        IMAGE
78    };
79
[2542]80    enum LegendType {
[2681]81        LEGEND_SCALAR,
82        LEGEND_VECTOR_MAGNITUDE,
83        LEGEND_VECTOR_X,
84        LEGEND_VECTOR_Y,
85        LEGEND_VECTOR_Z
[2542]86    };
87
[2120]88    typedef std::string DataSetId;
89    typedef std::string ColorMapId;
[2681]90    typedef std::string FieldId;
[2120]91    typedef std::tr1::unordered_map<DataSetId, DataSet *> DataSetHashmap;
[2681]92    typedef std::tr1::unordered_map<FieldId, double *> FieldRangeHashmap;
[2120]93    typedef std::tr1::unordered_map<ColorMapId, ColorMap *> ColorMapHashmap;
94    typedef std::tr1::unordered_map<DataSetId, Contour2D *> Contour2DHashmap;
[2302]95    typedef std::tr1::unordered_map<DataSetId, Contour3D *> Contour3DHashmap;
[2550]96    typedef std::tr1::unordered_map<DataSetId, Cutplane *> CutplaneHashmap;
[2302]97    typedef std::tr1::unordered_map<DataSetId, Glyphs *> GlyphsHashmap;
98    typedef std::tr1::unordered_map<DataSetId, HeightMap *> HeightMapHashmap;
[2322]99    typedef std::tr1::unordered_map<DataSetId, LIC *> LICHashmap;
100    typedef std::tr1::unordered_map<DataSetId, Molecule *> MoleculeHashmap;
[2120]101    typedef std::tr1::unordered_map<DataSetId, PolyData *> PolyDataHashmap;
[2302]102    typedef std::tr1::unordered_map<DataSetId, PseudoColor *> PseudoColorHashmap;
[2322]103    typedef std::tr1::unordered_map<DataSetId, Streamlines *> StreamlinesHashmap;
[2302]104    typedef std::tr1::unordered_map<DataSetId, Volume *> VolumeHashmap;
[2120]105
106    // Data sets
107
[2170]108    void addDataSet(const DataSetId& id);
[2120]109
[2170]110    void deleteDataSet(const DataSetId& id);
[2120]111
[2170]112    DataSet *getDataSet(const DataSetId& id);
[2120]113
[2542]114    void getDataSetNames(std::vector<std::string>& names);
115
[2170]116    bool setData(const DataSetId& id, char *data, int nbytes);
[2120]117
[2170]118    bool setDataFile(const DataSetId& id, const char *filename);
[2120]119
[2409]120    bool setDataSetActiveScalars(const DataSetId& id, const char *scalarName);
121
122    bool setDataSetActiveVectors(const DataSetId& id, const char *vectorName);
123
[2542]124    bool getScalarValueAtPixel(const DataSetId& id, int x, int y, double *value);
[2120]125
[2542]126    bool getScalarValue(const DataSetId& id, double x, double y, double z, double *value);
[2120]127
[2542]128    bool getVectorValueAtPixel(const DataSetId& id, int x, int y, double vector[3]);
[2120]129
[2542]130    bool getVectorValue(const DataSetId& id, double x, double y, double z, double vector[3]);
[2120]131
[2542]132    void setDataSetShowBounds(const DataSetId& id, bool state);
133
134    void setDataSetOutlineColor(const DataSetId& id, float color[3]);
135
136    void setDataSetOpacity(const DataSetId& id, double opacity);
137
138    void setDataSetVisibility(const DataSetId& id, bool state);
139
[2201]140    void setUseCumulativeDataRange(bool state, bool onlyVisible = false);
141
[2681]142    bool getUseCumulativeRange();
143
144    bool getCumulativeDataRange(double *range, const char *name,
145                                int numComponents,
146                                int component = -1);
147
148    bool getCumulativeDataRange(double *range, const char *name,
149                                DataSet::DataAttributeType type,
150                                int numComponents,
151                                int component = -1);
152
[2120]153    // Render window
154
[2409]155    /// Get the VTK render window object this Renderer uses
[2322]156    vtkRenderWindow *getRenderWindow()
157    {
158        return _renderWindow;
159    }
160
[2120]161    void setWindowSize(int width, int height);
162
163    int getWindowWidth() const;
164
165    int getWindowHeight() const;
166
167    // Camera controls
168
[2322]169    void setViewAngle(int height);
170
[2550]171    vtkCamera *getVtkCamera()
172    {
173        if (_renderer != NULL)
174            return _renderer->GetActiveCamera();
175        else
176            return NULL;
177    }
178
[2120]179    void setCameraMode(CameraMode mode);
180
[2201]181    CameraMode getCameraMode() const;
182
[2120]183    void resetCamera(bool resetOrientation = true);
184
[2409]185    void resetCameraClippingRange();
186
[2542]187    void setCameraZoomRegionPixels(int x, int y, int width, int height);
188
[2120]189    void setCameraZoomRegion(double x, double y, double width, double height);
190
[2201]191    void getCameraZoomRegion(double xywh[4]) const;
192
193    void getScreenWorldCoords(double xywh[4]) const;
194
[2120]195    void rotateCamera(double yaw, double pitch, double roll);
196
[2409]197    void setCameraOrientation(const double quat[4], bool absolute = true);
[2215]198
[2409]199    void panCamera(double x, double y, bool absolute = true);
[2215]200
[2409]201    void zoomCamera(double z, bool absolute = true);
202
203    void setCameraOrientationAndPosition(const double position[3],
204                                         const double focalPoint[3],
205                                         const double viewUp[3]);
206
[2215]207    void getCameraOrientationAndPosition(double position[3],
208                                         double focalPoint[3],
209                                         double viewUp[3]);
210
[2120]211    // Rendering an image
212
213    void setBackgroundColor(float color[3]);
214
[2322]215    void setClipPlane(Axis axis, double ratio, int direction);
216
[2409]217    void setUseTwoSidedLighting(bool state);
218
[2302]219    void setUseDepthPeeling(bool state);
220
[2409]221    void eventuallyRender();
222
[2120]223    bool render();
224
225    void getRenderedFrame(vtkUnsignedCharArray *imgData);
226
227    // Axes
228
[2302]229    void setAxesFlyMode(AxesFlyMode mode);
230
[2409]231    void setAxesVisibility(bool state);
232
[2120]233    void setAxesGridVisibility(bool state);
234
[2409]235    void setAxesLabelVisibility(bool state);
[2120]236
[2409]237    void setAxesTickVisibility(bool state);
238
239    void setAxesTickPosition(AxesTickPosition pos);
240
[2120]241    void setAxesColor(double color[3]);
242
[2409]243    void setAxisVisibility(Axis axis, bool state);
244
[2120]245    void setAxisGridVisibility(Axis axis, bool state);
246
[2409]247    void setAxisLabelVisibility(Axis axis, bool state);
[2120]248
[2409]249    void setAxisTickVisibility(Axis axis, bool state);
250
[2120]251    void setAxisTitle(Axis axis, const char *title);
252
253    void setAxisUnits(Axis axis, const char *units);
254
255    // Colormaps
256
[2170]257    void addColorMap(const ColorMapId& id, ColorMap *colorMap);
[2120]258
[2170]259    void deleteColorMap(const ColorMapId& id);
[2120]260
[2170]261    ColorMap *getColorMap(const ColorMapId& id);
[2120]262
[2170]263    bool renderColorMap(const ColorMapId& id,
264                        const DataSetId& dataSetID,
[2542]265                        LegendType legendType,
[2681]266                        const char *fieldName,
267                        DataSet::DataAttributeType type,
[2542]268                        std::string& title,
269                        double range[2],
[2120]270                        int width, int height,
[2742]271                        bool opaque,
[2542]272                        int numLabels,
[2120]273                        vtkUnsignedCharArray *imgData);
274
[2681]275    bool renderColorMap(const ColorMapId& id,
276                        const DataSetId& dataSetID,
277                        LegendType legendType,
278                        const char *fieldName,
279                        std::string& title,
280                        double range[2],
281                        int width, int height,
[2742]282                        bool opaque,
[2681]283                        int numLabels,
284                        vtkUnsignedCharArray *imgData);
[2120]285
[2681]286    bool renderColorMap(const ColorMapId& id,
287                        const DataSetId& dataSetID,
288                        LegendType legendType,
289                        std::string& title,
290                        double range[2],
291                        int width, int height,
[2742]292                        bool opaque,
[2681]293                        int numLabels,
294                        vtkUnsignedCharArray *imgData);
[2120]295
[2681]296    // Generic VtkGraphicsObject methods
[2542]297
[2681]298    template<class GraphicsObject>
299    GraphicsObject *getGraphicsObject(const DataSetId& id);
[2120]300
[2681]301    template<class GraphicsObject>
302    bool addGraphicsObject(const DataSetId& id);
[2120]303
[2681]304    template<class GraphicsObject>
305    void deleteGraphicsObject(const DataSetId& id);
[2120]306
[2681]307    template<class GraphicsObject>
308    void setGraphicsObjectColorMap(const DataSetId& id, const ColorMapId& colorMapId);
[2120]309
[2681]310    template<class GraphicsObject>
311    void setGraphicsObjectVolumeSlice(const DataSetId& id, Axis axis, double ratio);
[2120]312
[2681]313    //   Prop/Prop3D properties
[2120]314
[2681]315    template<class GraphicsObject>
316    void setGraphicsObjectOrientation(const DataSetId& id, double quat[4]);
[2409]317
[2681]318    template<class GraphicsObject>
319    void setGraphicsObjectOrientation(const DataSetId& id, double angle, double axis[3]);
[2120]320
[2681]321    template<class GraphicsObject>
322    void setGraphicsObjectPosition(const DataSetId& id, double pos[3]);
[2120]323
[2681]324    template<class GraphicsObject>
325    void setGraphicsObjectScale(const DataSetId& id, double scale[3]);
[2120]326
[2681]327    template<class GraphicsObject>
328    void setGraphicsObjectTransform(const DataSetId& id, vtkMatrix4x4 *trans);
[2409]329
[2681]330    template<class GraphicsObject>
331    void setGraphicsObjectVisibility(const DataSetId& id, bool state);
[2409]332
[2681]333    //   Actor properties
[2409]334
[2681]335    template<class GraphicsObject>
336    void setGraphicsObjectColor(const DataSetId& id, float color[3]);
[2170]337
[2681]338    template<class GraphicsObject>
339    void setGraphicsObjectEdgeVisibility(const DataSetId& id, bool state);
[2120]340
[2681]341    template<class GraphicsObject>
342    void setGraphicsObjectEdgeColor(const DataSetId& id, float color[3]);
[2542]343
[2681]344    template<class GraphicsObject>
345    void setGraphicsObjectEdgeWidth(const DataSetId& id, float edgeWidth);
[2120]346
[2681]347    template<class GraphicsObject>
348    void setGraphicsObjectAmbient(const DataSetId& id, double coeff);
[2120]349
[2681]350    template<class GraphicsObject>
351    void setGraphicsObjectDiffuse(const DataSetId& id, double coeff);
[2120]352
[2681]353    template<class GraphicsObject>
354    void setGraphicsObjectSpecular(const DataSetId& id, double coeff, double power);
[2120]355
[2681]356    template<class GraphicsObject>
357    void setGraphicsObjectLighting(const DataSetId& id, bool state);
[2120]358
[2681]359    template<class GraphicsObject>
360    void setGraphicsObjectOpacity(const DataSetId& id, double opacity);
[2120]361
[2681]362    template<class GraphicsObject>
363    void setGraphicsObjectPointSize(const DataSetId& id, float size);
[2120]364
[2681]365    template<class GraphicsObject>
366    void setGraphicsObjectWireframe(const DataSetId& id, bool state);
[2120]367
[2681]368    // 2D Contour plots
[2120]369
[2681]370    bool addContour2D(const DataSetId& id, int numContours);
[2170]371
[2681]372    bool addContour2D(const DataSetId& id, const std::vector<double>& contours);
[2302]373
[2681]374    void setContour2DContours(const DataSetId& id, int numContours);
[2409]375
[2681]376    void setContour2DContourList(const DataSetId& id, const std::vector<double>& contours);
[2409]377
[2681]378    // 3D Contour (isosurface) plots
[2409]379
[2681]380    bool addContour3D(const DataSetId& id, int numContours);
[2302]381
[2681]382    bool addContour3D(const DataSetId& id, const std::vector<double>& contours);
383
[2409]384    void setContour3DContours(const DataSetId& id, int numContours);
[2302]385
[2409]386    void setContour3DContourList(const DataSetId& id, const std::vector<double>& contours);
387
[2550]388    // Cutplanes
389
[2681]390    void setCutplaneSliceVisibility(const DataSetId& id, Axis axis, bool state);
[2550]391
[2681]392    void setCutplaneColorMode(const DataSetId& id,
393                              Cutplane::ColorMode mode,
394                              const char *name, double range[2] = NULL);
[2550]395
[2681]396    void setCutplaneColorMode(const DataSetId& id,
397                              Cutplane::ColorMode mode,
398                              DataSet::DataAttributeType type,
399                              const char *name, double range[2] = NULL);
[2550]400
[2302]401    // Glyphs
402
[2542]403    bool addGlyphs(const DataSetId& id, Glyphs::GlyphShape shape);
[2302]404
[2409]405    void setGlyphsShape(const DataSetId& id, Glyphs::GlyphShape shape);
406
[2681]407    void setGlyphsColorMode(const DataSetId& id,
408                            Glyphs::ColorMode mode,
409                            const char *name,
410                            double range[2] = NULL);
[2409]411
[2681]412    void setGlyphsScalingMode(const DataSetId& id,
413                              Glyphs::ScalingMode mode,
414                              const char *name,
415                              double range[2] = NULL);
[2409]416
[2542]417    void setGlyphsNormalizeScale(const DataSetId& id, bool normalize);
418
[2409]419    void setGlyphsScaleFactor(const DataSetId& id, double scale);
420
[2302]421    // Height maps
422
[2542]423    bool addHeightMap(const DataSetId& id, int numContours, double heightScale);
[2302]424
[2542]425    bool addHeightMap(const DataSetId& id, const std::vector<double>& contours, double heightScale);
426
[2409]427    void setHeightMapHeightScale(const DataSetId& id, double scale);
[2302]428
[2542]429    void setHeightMapNumContours(const DataSetId& id, int numContours);
[2409]430
431    void setHeightMapContourList(const DataSetId& id, const std::vector<double>& contours);
432
[2542]433    void setHeightMapContourSurfaceVisibility(const DataSetId& id, bool state);
[2302]434
[2542]435    void setHeightMapContourLineVisibility(const DataSetId& id, bool state);
436
[2302]437    void setHeightMapContourEdgeColor(const DataSetId& id, float color[3]);
438
439    void setHeightMapContourEdgeWidth(const DataSetId& id, float edgeWidth);
440
[2322]441    // Molecules
442
[2409]443    void setMoleculeAtomScaling(const DataSetId& id, Molecule::AtomScaling scaling);
444
445    void setMoleculeAtomVisibility(const DataSetId& id, bool state);
446
447    void setMoleculeBondVisibility(const DataSetId& id, bool state);
448
[2302]449    // Color-mapped surfaces
450
[2681]451    void setPseudoColorColorMode(const DataSetId& id,
452                                 PseudoColor::ColorMode mode,
453                                 const char *name, double range[2] = NULL);
[2302]454
[2681]455    void setPseudoColorColorMode(const DataSetId& id,
456                                 PseudoColor::ColorMode mode,
457                                 DataSet::DataAttributeType type,
458                                 const char *name, double range[2] = NULL);
[2302]459
[2322]460    // Streamlines
461
[2681]462    void setStreamlinesNumberOfSeedPoints(const DataSetId& id, int numPoints);
[2322]463
[2550]464    void setStreamlinesSeedToMeshPoints(const DataSetId& id);
[2322]465
[2550]466    void setStreamlinesSeedToFilledMesh(const DataSetId& id, int numPoints);
467
468    bool setStreamlinesSeedToMeshPoints(const DataSetId& id,
469                                        char *data, size_t nbytes);
470
471    bool setStreamlinesSeedToFilledMesh(const DataSetId& id,
472                                        char *data, size_t nbytes,
473                                        int numPoints);
474
[2409]475    void setStreamlinesSeedToRake(const DataSetId& id,
476                                  double start[3], double end[3],
477                                  int numPoints);
[2322]478
[2409]479    void setStreamlinesSeedToDisk(const DataSetId& id,
480                                  double center[3], double normal[3],
481                                  double radius, double innerRadius,
482                                  int numPoints);
[2322]483
[2409]484    void setStreamlinesSeedToPolygon(const DataSetId& id,
485                                     double center[3], double normal[3],
486                                     double angle, double radius,
487                                     int numSides);
488
489    void setStreamlinesSeedToFilledPolygon(const DataSetId& id,
490                                           double center[3], double normal[3],
491                                           double angle, double radius,
492                                           int numSides, int numPoints);
493
[2322]494    void setStreamlinesLength(const DataSetId& id, double length);
495
496    void setStreamlinesTypeToLines(const DataSetId& id);
497
498    void setStreamlinesTypeToTubes(const DataSetId& id, int numSides, double radius);
499
500    void setStreamlinesTypeToRibbons(const DataSetId& id, double width, double angle);
501
[2409]502    void setStreamlinesSeedVisibility(const DataSetId& id, bool state);
[2322]503
[2681]504    void setStreamlinesColorMode(const DataSetId& id,
505                                 Streamlines::ColorMode mode,
506                                 const char *name, double range[2] = NULL);
[2322]507
[2681]508    void setStreamlinesColorMode(const DataSetId& id,
509                                 Streamlines::ColorMode mode,
510                                 DataSet::DataAttributeType type,
511                                 const char *name, double range[2] = NULL);
[2322]512
513    void setStreamlinesSeedColor(const DataSetId& id, float color[3]);
514
[2681]515private:
516    static void printCameraInfo(vtkCamera *camera);
[2302]517
[2681]518    static void setCameraFromMatrix(vtkCamera *camera, vtkMatrix4x4 &mat);
[2302]519
[2681]520    static void mergeBounds(double *boundsDest, const double *bounds1, const double *bounds2);
[2302]521
[2681]522    template<class GraphicsObject>
523    std::tr1::unordered_map<DataSetId, GraphicsObject *>&getGraphicsObjectHashmap();
[2302]524
[2120]525    void collectBounds(double *bounds, bool onlyVisible);
526
[2542]527    void collectDataRanges();
[2170]528
[2681]529    void collectDataRanges(double *range, const char *name,
530                           DataSet::DataAttributeType type,
531                           int component, bool onlyVisible);
[2170]532
[2681]533    void clearFieldRanges();
[2542]534
[2681]535    void initFieldRanges();
[2542]536
[2681]537    void updateFieldRanges();
[2542]538
539    void updateColorMap(ColorMap *cmap);
540
541    bool colorMapUsed(ColorMap *cmap);
542
[2215]543    void computeDisplayToWorld(double x, double y, double z, double worldPt[4]);
544
545    void computeWorldToDisplay(double x, double y, double z, double displayPt[3]);
546
[2201]547    void computeScreenWorldCoords();
548
[2542]549    bool is2D(const double bounds[6],
550              PrincipalPlane *plane,
551              double *offset) const;
[2120]552    void initCamera();
553    void initAxes();
[2542]554    void resetAxes(double bounds[6] = NULL);
[2302]555    void setCameraClippingPlanes();
[2120]556
557    bool _needsRedraw;
558    int _windowWidth, _windowHeight;
559    double _imgWorldOrigin[2];
560    double _imgWorldDims[2];
[2542]561    PrincipalPlane _imgCameraPlane;
562    double _imgCameraOffset;
[2201]563    double _screenWorldCoords[4];
[2409]564    double _cameraOrientation[4];
[2201]565    double _cameraZoomRatio;
566    double _cameraPan[2];
[2120]567    float _bgColor[3];
[2201]568    bool _useCumulativeRange;
569    bool _cumulativeRangeOnlyVisible;
[2120]570
[2681]571    FieldRangeHashmap _scalarPointDataRange;
572    FieldRangeHashmap _vectorPointDataRange;
573    FieldRangeHashmap _vectorCompPointDataRange[3];
574    FieldRangeHashmap _scalarCellDataRange;
575    FieldRangeHashmap _vectorCellDataRange;
576    FieldRangeHashmap _vectorCompCellDataRange[3];
577
[2120]578    ColorMapHashmap _colorMaps;
579    DataSetHashmap _dataSets;
[2302]580    Contour2DHashmap _contour2Ds;
581    Contour3DHashmap _contour3Ds;
[2550]582    CutplaneHashmap _cutplanes;
[2302]583    GlyphsHashmap _glyphs;
584    HeightMapHashmap _heightMaps;
[2322]585    LICHashmap _lics;
586    MoleculeHashmap _molecules;
[2302]587    PolyDataHashmap _polyDatas;
[2120]588    PseudoColorHashmap _pseudoColors;
[2322]589    StreamlinesHashmap _streamlines;
[2302]590    VolumeHashmap _volumes;
[2120]591
592    CameraMode _cameraMode;
593
[2322]594    vtkSmartPointer<vtkPlane> _cameraClipPlanes[4];
595    vtkSmartPointer<vtkPlane> _userClipPlanes[6];
[2302]596    vtkSmartPointer<vtkPlaneCollection> _activeClipPlanes;
[2120]597    vtkSmartPointer<vtkCubeAxesActor> _cubeAxesActor; // For 3D view
598#ifdef USE_CUSTOM_AXES
599    vtkSmartPointer<vtkRpCubeAxesActor2D> _cubeAxesActor2D; // For 2D view
600#else
601    vtkSmartPointer<vtkCubeAxesActor2D> _cubeAxesActor2D; // For 2D view
602#endif
603    vtkSmartPointer<vtkScalarBarActor> _scalarBarActor;
604    vtkSmartPointer<vtkRenderer> _renderer;
605    vtkSmartPointer<vtkRenderer> _legendRenderer;
606    vtkSmartPointer<vtkRenderWindow> _renderWindow;
607    vtkSmartPointer<vtkRenderWindow> _legendRenderWindow;
608};
609
610}
611}
612
613#endif
Note: See TracBrowser for help on using the repository browser.