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

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

Use new custom vtk 3d axes (when USE_CUSTOM_AXES is defined). Fixes gridlines
in 3D.

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