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

Last change on this file since 2639 was 2612, checked in by ldelgass, 13 years ago

Refactor vtkvis to support setting colormap fields by name/attribute type
rather than always using active scalars/vectors. Also convert common
graphics objects set methods in Renderer to template methods and separate
core and graphics object related methods to separate files.

  • Property svn:eol-style set to native
File size: 19.2 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#include <vtkCubeAxesActor.h>
18#ifdef USE_CUSTOM_AXES
19#include "vtkRpCubeAxesActor2D.h"
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"
29#include "RpTypes.h"
30#include "RpVtkDataSet.h"
31#include "RpContour2D.h"
32#include "RpContour3D.h"
33#include "RpCutplane.h"
34#include "RpGlyphs.h"
35#include "RpHeightMap.h"
36#include "RpLIC.h"
37#include "RpMolecule.h"
38#include "RpPolyData.h"
39#include "RpPseudoColor.h"
40#include "RpStreamlines.h"
41#include "RpVolume.h"
42#include "Trace.h"
43
44// Controls if TGA format is sent to client
45//#define RENDER_TARGA
46#define TARGA_BYTES_PER_PIXEL 3
47
48namespace Rappture {
49namespace VtkVis {
50
51/**
52 * \brief VTK Renderer
53 */
54class Renderer
55{
56public:
57    Renderer();
58    virtual ~Renderer();
59
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
68    enum AxesTickPosition {
69        TICKS_INSIDE,
70        TICKS_OUTSIDE,
71        TICKS_BOTH
72    };
73
74    enum CameraMode {
75        PERSPECTIVE,
76        ORTHO,
77        IMAGE
78    };
79
80    enum LegendType {
81        LEGEND_SCALAR,
82        LEGEND_VECTOR_MAGNITUDE,
83        LEGEND_VECTOR_X,
84        LEGEND_VECTOR_Y,
85        LEGEND_VECTOR_Z
86    };
87
88    typedef std::string DataSetId;
89    typedef std::string ColorMapId;
90    typedef std::string FieldId;
91    typedef std::tr1::unordered_map<DataSetId, DataSet *> DataSetHashmap;
92    typedef std::tr1::unordered_map<FieldId, double *> FieldRangeHashmap;
93    typedef std::tr1::unordered_map<ColorMapId, ColorMap *> ColorMapHashmap;
94    typedef std::tr1::unordered_map<DataSetId, Contour2D *> Contour2DHashmap;
95    typedef std::tr1::unordered_map<DataSetId, Contour3D *> Contour3DHashmap;
96    typedef std::tr1::unordered_map<DataSetId, Cutplane *> CutplaneHashmap;
97    typedef std::tr1::unordered_map<DataSetId, Glyphs *> GlyphsHashmap;
98    typedef std::tr1::unordered_map<DataSetId, HeightMap *> HeightMapHashmap;
99    typedef std::tr1::unordered_map<DataSetId, LIC *> LICHashmap;
100    typedef std::tr1::unordered_map<DataSetId, Molecule *> MoleculeHashmap;
101    typedef std::tr1::unordered_map<DataSetId, PolyData *> PolyDataHashmap;
102    typedef std::tr1::unordered_map<DataSetId, PseudoColor *> PseudoColorHashmap;
103    typedef std::tr1::unordered_map<DataSetId, Streamlines *> StreamlinesHashmap;
104    typedef std::tr1::unordered_map<DataSetId, Volume *> VolumeHashmap;
105
106    // Data sets
107
108    void addDataSet(const DataSetId& id);
109
110    void deleteDataSet(const DataSetId& id);
111
112    DataSet *getDataSet(const DataSetId& id);
113
114    void getDataSetNames(std::vector<std::string>& names);
115
116    bool setData(const DataSetId& id, char *data, int nbytes);
117
118    bool setDataFile(const DataSetId& id, const char *filename);
119
120    bool setDataSetActiveScalars(const DataSetId& id, const char *scalarName);
121
122    bool setDataSetActiveVectors(const DataSetId& id, const char *vectorName);
123
124    bool getScalarValueAtPixel(const DataSetId& id, int x, int y, double *value);
125
126    bool getScalarValue(const DataSetId& id, double x, double y, double z, double *value);
127
128    bool getVectorValueAtPixel(const DataSetId& id, int x, int y, double vector[3]);
129
130    bool getVectorValue(const DataSetId& id, double x, double y, double z, double vector[3]);
131
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
140    void setUseCumulativeDataRange(bool state, bool onlyVisible = false);
141
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
153    // Render window
154
155    /// Get the VTK render window object this Renderer uses
156    vtkRenderWindow *getRenderWindow()
157    {
158        return _renderWindow;
159    }
160
161    void setWindowSize(int width, int height);
162
163    int getWindowWidth() const;
164
165    int getWindowHeight() const;
166
167    // Camera controls
168
169    void setViewAngle(int height);
170
171    vtkCamera *getVtkCamera()
172    {
173        if (_renderer != NULL)
174            return _renderer->GetActiveCamera();
175        else
176            return NULL;
177    }
178
179    void setCameraMode(CameraMode mode);
180
181    CameraMode getCameraMode() const;
182
183    void resetCamera(bool resetOrientation = true);
184
185    void resetCameraClippingRange();
186
187    void setCameraZoomRegionPixels(int x, int y, int width, int height);
188
189    void setCameraZoomRegion(double x, double y, double width, double height);
190
191    void getCameraZoomRegion(double xywh[4]) const;
192
193    void getScreenWorldCoords(double xywh[4]) const;
194
195    void rotateCamera(double yaw, double pitch, double roll);
196
197    void setCameraOrientation(const double quat[4], bool absolute = true);
198
199    void panCamera(double x, double y, bool absolute = true);
200
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
207    void getCameraOrientationAndPosition(double position[3],
208                                         double focalPoint[3],
209                                         double viewUp[3]);
210
211    // Rendering an image
212
213    void setBackgroundColor(float color[3]);
214
215    void setClipPlane(Axis axis, double ratio, int direction);
216
217    void setUseTwoSidedLighting(bool state);
218
219    void setUseDepthPeeling(bool state);
220
221    void eventuallyRender();
222
223    bool render();
224
225    void getRenderedFrame(vtkUnsignedCharArray *imgData);
226
227    // Axes
228
229    void setAxesFlyMode(AxesFlyMode mode);
230
231    void setAxesVisibility(bool state);
232
233    void setAxesGridVisibility(bool state);
234
235    void setAxesLabelVisibility(bool state);
236
237    void setAxesTickVisibility(bool state);
238
239    void setAxesTickPosition(AxesTickPosition pos);
240
241    void setAxesColor(double color[3]);
242
243    void setAxisVisibility(Axis axis, bool state);
244
245    void setAxisGridVisibility(Axis axis, bool state);
246
247    void setAxisLabelVisibility(Axis axis, bool state);
248
249    void setAxisTickVisibility(Axis axis, bool state);
250
251    void setAxisTitle(Axis axis, const char *title);
252
253    void setAxisUnits(Axis axis, const char *units);
254
255    // Colormaps
256
257    void addColorMap(const ColorMapId& id, ColorMap *colorMap);
258
259    void deleteColorMap(const ColorMapId& id);
260
261    ColorMap *getColorMap(const ColorMapId& id);
262
263    bool renderColorMap(const ColorMapId& id,
264                        const DataSetId& dataSetID,
265                        LegendType legendType,
266                        const char *fieldName,
267                        DataSet::DataAttributeType type,
268                        std::string& title,
269                        double range[2],
270                        int width, int height,
271                        int numLabels,
272                        vtkUnsignedCharArray *imgData);
273
274    bool renderColorMap(const ColorMapId& id,
275                        const DataSetId& dataSetID,
276                        LegendType legendType,
277                        const char *fieldName,
278                        std::string& title,
279                        double range[2],
280                        int width, int height,
281                        int numLabels,
282                        vtkUnsignedCharArray *imgData);
283
284    bool renderColorMap(const ColorMapId& id,
285                        const DataSetId& dataSetID,
286                        LegendType legendType,
287                        std::string& title,
288                        double range[2],
289                        int width, int height,
290                        int numLabels,
291                        vtkUnsignedCharArray *imgData);
292
293    // Generic VtkGraphicsObject methods
294
295    template<class GraphicsObject>
296    GraphicsObject *getGraphicsObject(const DataSetId& id);
297
298    template<class GraphicsObject>
299    bool addGraphicsObject(const DataSetId& id);
300
301    template<class GraphicsObject>
302    void deleteGraphicsObject(const DataSetId& id);
303
304    template<class GraphicsObject>
305    void setGraphicsObjectColorMap(const DataSetId& id, const ColorMapId& colorMapId);
306
307    template<class GraphicsObject>
308    void setGraphicsObjectVolumeSlice(const DataSetId& id, Axis axis, double ratio);
309
310    //   Prop/Prop3D properties
311
312    template<class GraphicsObject>
313    void setGraphicsObjectOrientation(const DataSetId& id, double quat[4]);
314
315    template<class GraphicsObject>
316    void setGraphicsObjectOrientation(const DataSetId& id, double angle, double axis[3]);
317
318    template<class GraphicsObject>
319    void setGraphicsObjectPosition(const DataSetId& id, double pos[3]);
320
321    template<class GraphicsObject>
322    void setGraphicsObjectScale(const DataSetId& id, double scale[3]);
323
324    template<class GraphicsObject>
325    void setGraphicsObjectTransform(const DataSetId& id, vtkMatrix4x4 *trans);
326
327    template<class GraphicsObject>
328    void setGraphicsObjectVisibility(const DataSetId& id, bool state);
329
330    //   Actor properties
331
332    template<class GraphicsObject>
333    void setGraphicsObjectColor(const DataSetId& id, float color[3]);
334
335    template<class GraphicsObject>
336    void setGraphicsObjectEdgeVisibility(const DataSetId& id, bool state);
337
338    template<class GraphicsObject>
339    void setGraphicsObjectEdgeColor(const DataSetId& id, float color[3]);
340
341    template<class GraphicsObject>
342    void setGraphicsObjectEdgeWidth(const DataSetId& id, float edgeWidth);
343
344    template<class GraphicsObject>
345    void setGraphicsObjectAmbient(const DataSetId& id, double coeff);
346
347    template<class GraphicsObject>
348    void setGraphicsObjectDiffuse(const DataSetId& id, double coeff);
349
350    template<class GraphicsObject>
351    void setGraphicsObjectSpecular(const DataSetId& id, double coeff, double power);
352
353    template<class GraphicsObject>
354    void setGraphicsObjectLighting(const DataSetId& id, bool state);
355
356    template<class GraphicsObject>
357    void setGraphicsObjectOpacity(const DataSetId& id, double opacity);
358
359    template<class GraphicsObject>
360    void setGraphicsObjectPointSize(const DataSetId& id, float size);
361
362    template<class GraphicsObject>
363    void setGraphicsObjectWireframe(const DataSetId& id, bool state);
364
365    // 2D Contour plots
366
367    bool addContour2D(const DataSetId& id, int numContours);
368
369    bool addContour2D(const DataSetId& id, const std::vector<double>& contours);
370
371    void setContour2DContours(const DataSetId& id, int numContours);
372
373    void setContour2DContourList(const DataSetId& id, const std::vector<double>& contours);
374
375    // 3D Contour (isosurface) plots
376
377    bool addContour3D(const DataSetId& id, int numContours);
378
379    bool addContour3D(const DataSetId& id, const std::vector<double>& contours);
380
381    void setContour3DContours(const DataSetId& id, int numContours);
382
383    void setContour3DContourList(const DataSetId& id, const std::vector<double>& contours);
384
385    // Cutplanes
386
387    void setCutplaneSliceVisibility(const DataSetId& id, Axis axis, bool state);
388
389    void setCutplaneColorMode(const DataSetId& id,
390                              Cutplane::ColorMode mode,
391                              const char *name, double range[2] = NULL);
392
393    void setCutplaneColorMode(const DataSetId& id,
394                              Cutplane::ColorMode mode,
395                              DataSet::DataAttributeType type,
396                              const char *name, double range[2] = NULL);
397
398    // Glyphs
399
400    bool addGlyphs(const DataSetId& id, Glyphs::GlyphShape shape);
401
402    void setGlyphsShape(const DataSetId& id, Glyphs::GlyphShape shape);
403
404    void setGlyphsColorMode(const DataSetId& id, Glyphs::ColorMode mode);
405
406    void setGlyphsScalingMode(const DataSetId& id, Glyphs::ScalingMode mode);
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
506private:
507    static void printCameraInfo(vtkCamera *camera);
508
509    static void setCameraFromMatrix(vtkCamera *camera, vtkMatrix4x4 &mat);
510
511    static void mergeBounds(double *boundsDest, const double *bounds1, const double *bounds2);
512
513    template<class GraphicsObject>
514    std::tr1::unordered_map<DataSetId, GraphicsObject *>&getGraphicsObjectHashmap();
515
516    void collectBounds(double *bounds, bool onlyVisible);
517
518    void collectDataRanges();
519
520    void collectDataRanges(double *range, const char *name,
521                           DataSet::DataAttributeType type,
522                           int component, bool onlyVisible);
523
524    void clearFieldRanges();
525
526    void initFieldRanges();
527
528    void updateFieldRanges();
529
530    void updateColorMap(ColorMap *cmap);
531
532    bool colorMapUsed(ColorMap *cmap);
533
534    void computeDisplayToWorld(double x, double y, double z, double worldPt[4]);
535
536    void computeWorldToDisplay(double x, double y, double z, double displayPt[3]);
537
538    void computeScreenWorldCoords();
539
540    bool is2D(const double bounds[6],
541              PrincipalPlane *plane,
542              double *offset) const;
543    void initCamera();
544    void initAxes();
545    void resetAxes(double bounds[6] = NULL);
546    void setCameraClippingPlanes();
547
548    bool _needsRedraw;
549    int _windowWidth, _windowHeight;
550    double _imgWorldOrigin[2];
551    double _imgWorldDims[2];
552    PrincipalPlane _imgCameraPlane;
553    double _imgCameraOffset;
554    double _screenWorldCoords[4];
555    double _cameraOrientation[4];
556    double _cameraZoomRatio;
557    double _cameraPan[2];
558    float _bgColor[3];
559    bool _useCumulativeRange;
560    bool _cumulativeRangeOnlyVisible;
561
562    FieldRangeHashmap _scalarPointDataRange;
563    FieldRangeHashmap _vectorPointDataRange;
564    FieldRangeHashmap _vectorCompPointDataRange[3];
565    FieldRangeHashmap _scalarCellDataRange;
566    FieldRangeHashmap _vectorCellDataRange;
567    FieldRangeHashmap _vectorCompCellDataRange[3];
568
569    ColorMapHashmap _colorMaps;
570    DataSetHashmap _dataSets;
571    Contour2DHashmap _contour2Ds;
572    Contour3DHashmap _contour3Ds;
573    CutplaneHashmap _cutplanes;
574    GlyphsHashmap _glyphs;
575    HeightMapHashmap _heightMaps;
576    LICHashmap _lics;
577    MoleculeHashmap _molecules;
578    PolyDataHashmap _polyDatas;
579    PseudoColorHashmap _pseudoColors;
580    StreamlinesHashmap _streamlines;
581    VolumeHashmap _volumes;
582
583    CameraMode _cameraMode;
584
585    vtkSmartPointer<vtkPlane> _cameraClipPlanes[4];
586    vtkSmartPointer<vtkPlane> _userClipPlanes[6];
587    vtkSmartPointer<vtkPlaneCollection> _activeClipPlanes;
588    vtkSmartPointer<vtkCubeAxesActor> _cubeAxesActor; // For 3D view
589#ifdef USE_CUSTOM_AXES
590    vtkSmartPointer<vtkRpCubeAxesActor2D> _cubeAxesActor2D; // For 2D view
591#else
592    vtkSmartPointer<vtkCubeAxesActor2D> _cubeAxesActor2D; // For 2D view
593#endif
594    vtkSmartPointer<vtkScalarBarActor> _scalarBarActor;
595    vtkSmartPointer<vtkRenderer> _renderer;
596    vtkSmartPointer<vtkRenderer> _legendRenderer;
597    vtkSmartPointer<vtkRenderWindow> _renderWindow;
598    vtkSmartPointer<vtkRenderWindow> _legendRenderWindow;
599};
600
601}
602}
603
604#endif
Note: See TracBrowser for help on using the repository browser.