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

Last change on this file since 2681 was 2681, checked in by gah, 11 years ago
File size: 19.4 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,
405                            Glyphs::ColorMode mode,
406                            const char *name,
407                            double range[2] = NULL);
408
409    void setGlyphsScalingMode(const DataSetId& id,
410                              Glyphs::ScalingMode mode,
411                              const char *name,
412                              double range[2] = NULL);
413
414    void setGlyphsNormalizeScale(const DataSetId& id, bool normalize);
415
416    void setGlyphsScaleFactor(const DataSetId& id, double scale);
417
418    // Height maps
419
420    bool addHeightMap(const DataSetId& id, int numContours, double heightScale);
421
422    bool addHeightMap(const DataSetId& id, const std::vector<double>& contours, double heightScale);
423
424    void setHeightMapHeightScale(const DataSetId& id, double scale);
425
426    void setHeightMapNumContours(const DataSetId& id, int numContours);
427
428    void setHeightMapContourList(const DataSetId& id, const std::vector<double>& contours);
429
430    void setHeightMapContourSurfaceVisibility(const DataSetId& id, bool state);
431
432    void setHeightMapContourLineVisibility(const DataSetId& id, bool state);
433
434    void setHeightMapContourEdgeColor(const DataSetId& id, float color[3]);
435
436    void setHeightMapContourEdgeWidth(const DataSetId& id, float edgeWidth);
437
438    // Molecules
439
440    void setMoleculeAtomScaling(const DataSetId& id, Molecule::AtomScaling scaling);
441
442    void setMoleculeAtomVisibility(const DataSetId& id, bool state);
443
444    void setMoleculeBondVisibility(const DataSetId& id, bool state);
445
446    // Color-mapped surfaces
447
448    void setPseudoColorColorMode(const DataSetId& id,
449                                 PseudoColor::ColorMode mode,
450                                 const char *name, double range[2] = NULL);
451
452    void setPseudoColorColorMode(const DataSetId& id,
453                                 PseudoColor::ColorMode mode,
454                                 DataSet::DataAttributeType type,
455                                 const char *name, double range[2] = NULL);
456
457    // Streamlines
458
459    void setStreamlinesNumberOfSeedPoints(const DataSetId& id, int numPoints);
460
461    void setStreamlinesSeedToMeshPoints(const DataSetId& id);
462
463    void setStreamlinesSeedToFilledMesh(const DataSetId& id, int numPoints);
464
465    bool setStreamlinesSeedToMeshPoints(const DataSetId& id,
466                                        char *data, size_t nbytes);
467
468    bool setStreamlinesSeedToFilledMesh(const DataSetId& id,
469                                        char *data, size_t nbytes,
470                                        int numPoints);
471
472    void setStreamlinesSeedToRake(const DataSetId& id,
473                                  double start[3], double end[3],
474                                  int numPoints);
475
476    void setStreamlinesSeedToDisk(const DataSetId& id,
477                                  double center[3], double normal[3],
478                                  double radius, double innerRadius,
479                                  int numPoints);
480
481    void setStreamlinesSeedToPolygon(const DataSetId& id,
482                                     double center[3], double normal[3],
483                                     double angle, double radius,
484                                     int numSides);
485
486    void setStreamlinesSeedToFilledPolygon(const DataSetId& id,
487                                           double center[3], double normal[3],
488                                           double angle, double radius,
489                                           int numSides, int numPoints);
490
491    void setStreamlinesLength(const DataSetId& id, double length);
492
493    void setStreamlinesTypeToLines(const DataSetId& id);
494
495    void setStreamlinesTypeToTubes(const DataSetId& id, int numSides, double radius);
496
497    void setStreamlinesTypeToRibbons(const DataSetId& id, double width, double angle);
498
499    void setStreamlinesSeedVisibility(const DataSetId& id, bool state);
500
501    void setStreamlinesColorMode(const DataSetId& id,
502                                 Streamlines::ColorMode mode,
503                                 const char *name, double range[2] = NULL);
504
505    void setStreamlinesColorMode(const DataSetId& id,
506                                 Streamlines::ColorMode mode,
507                                 DataSet::DataAttributeType type,
508                                 const char *name, double range[2] = NULL);
509
510    void setStreamlinesSeedColor(const DataSetId& id, float color[3]);
511
512private:
513    static void printCameraInfo(vtkCamera *camera);
514
515    static void setCameraFromMatrix(vtkCamera *camera, vtkMatrix4x4 &mat);
516
517    static void mergeBounds(double *boundsDest, const double *bounds1, const double *bounds2);
518
519    template<class GraphicsObject>
520    std::tr1::unordered_map<DataSetId, GraphicsObject *>&getGraphicsObjectHashmap();
521
522    void collectBounds(double *bounds, bool onlyVisible);
523
524    void collectDataRanges();
525
526    void collectDataRanges(double *range, const char *name,
527                           DataSet::DataAttributeType type,
528                           int component, bool onlyVisible);
529
530    void clearFieldRanges();
531
532    void initFieldRanges();
533
534    void updateFieldRanges();
535
536    void updateColorMap(ColorMap *cmap);
537
538    bool colorMapUsed(ColorMap *cmap);
539
540    void computeDisplayToWorld(double x, double y, double z, double worldPt[4]);
541
542    void computeWorldToDisplay(double x, double y, double z, double displayPt[3]);
543
544    void computeScreenWorldCoords();
545
546    bool is2D(const double bounds[6],
547              PrincipalPlane *plane,
548              double *offset) const;
549    void initCamera();
550    void initAxes();
551    void resetAxes(double bounds[6] = NULL);
552    void setCameraClippingPlanes();
553
554    bool _needsRedraw;
555    int _windowWidth, _windowHeight;
556    double _imgWorldOrigin[2];
557    double _imgWorldDims[2];
558    PrincipalPlane _imgCameraPlane;
559    double _imgCameraOffset;
560    double _screenWorldCoords[4];
561    double _cameraOrientation[4];
562    double _cameraZoomRatio;
563    double _cameraPan[2];
564    float _bgColor[3];
565    bool _useCumulativeRange;
566    bool _cumulativeRangeOnlyVisible;
567
568    FieldRangeHashmap _scalarPointDataRange;
569    FieldRangeHashmap _vectorPointDataRange;
570    FieldRangeHashmap _vectorCompPointDataRange[3];
571    FieldRangeHashmap _scalarCellDataRange;
572    FieldRangeHashmap _vectorCellDataRange;
573    FieldRangeHashmap _vectorCompCellDataRange[3];
574
575    ColorMapHashmap _colorMaps;
576    DataSetHashmap _dataSets;
577    Contour2DHashmap _contour2Ds;
578    Contour3DHashmap _contour3Ds;
579    CutplaneHashmap _cutplanes;
580    GlyphsHashmap _glyphs;
581    HeightMapHashmap _heightMaps;
582    LICHashmap _lics;
583    MoleculeHashmap _molecules;
584    PolyDataHashmap _polyDatas;
585    PseudoColorHashmap _pseudoColors;
586    StreamlinesHashmap _streamlines;
587    VolumeHashmap _volumes;
588
589    CameraMode _cameraMode;
590
591    vtkSmartPointer<vtkPlane> _cameraClipPlanes[4];
592    vtkSmartPointer<vtkPlane> _userClipPlanes[6];
593    vtkSmartPointer<vtkPlaneCollection> _activeClipPlanes;
594    vtkSmartPointer<vtkCubeAxesActor> _cubeAxesActor; // For 3D view
595#ifdef USE_CUSTOM_AXES
596    vtkSmartPointer<vtkRpCubeAxesActor2D> _cubeAxesActor2D; // For 2D view
597#else
598    vtkSmartPointer<vtkCubeAxesActor2D> _cubeAxesActor2D; // For 2D view
599#endif
600    vtkSmartPointer<vtkScalarBarActor> _scalarBarActor;
601    vtkSmartPointer<vtkRenderer> _renderer;
602    vtkSmartPointer<vtkRenderer> _legendRenderer;
603    vtkSmartPointer<vtkRenderWindow> _renderWindow;
604    vtkSmartPointer<vtkRenderWindow> _legendRenderWindow;
605};
606
607}
608}
609
610#endif
Note: See TracBrowser for help on using the repository browser.