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

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

Protocol support for colormapping contour2ds.

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