source: trunk/packages/vizservers/vtkvis/RpVtkRenderer.h @ 3092

Last change on this file since 3092 was 3092, checked in by ldelgass, 12 years ago

Add 'glyphs gorient' command to toggle orienting glyphs by a vector field.

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