VTK
/Users/kitware/Dashboards/MyTests/VTK_BLD_Release_docs/Utilities/Doxygen/dox/Rendering/Parallel/vtkSynchronizedRenderers.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile$
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00032 #ifndef vtkSynchronizedRenderers_h
00033 #define vtkSynchronizedRenderers_h
00034 
00035 #include "vtkRenderingParallelModule.h" // For export macro
00036 #include "vtkObject.h"
00037 #include "vtkUnsignedCharArray.h" // needed for vtkUnsignedCharArray.
00038 #include "vtkSmartPointer.h" // needed for vtkSmartPointer.
00039 
00040 class vtkRenderer;
00041 class vtkMultiProcessController;
00042 class vtkMultiProcessStream;
00043 class vtkOpenGLRenderer;
00044 
00045 class VTKRENDERINGPARALLEL_EXPORT vtkSynchronizedRenderers : public vtkObject
00046 {
00047 public:
00048   static vtkSynchronizedRenderers* New();
00049   vtkTypeMacro(vtkSynchronizedRenderers, vtkObject);
00050   void PrintSelf(ostream& os, vtkIndent indent);
00051 
00053 
00057   virtual void SetRenderer(vtkRenderer*);
00058   virtual vtkRenderer* GetRenderer();
00060 
00062 
00064   virtual void SetParallelController(vtkMultiProcessController*);
00065   vtkGetObjectMacro(ParallelController, vtkMultiProcessController);
00067 
00069 
00071   vtkSetMacro(ParallelRendering, bool);
00072   vtkGetMacro(ParallelRendering, bool);
00073   vtkBooleanMacro(ParallelRendering, bool);
00075 
00077 
00078   vtkSetClampMacro(ImageReductionFactor, int, 1, 50);
00079   vtkGetMacro(ImageReductionFactor, int);
00081 
00083 
00086   vtkSetMacro(WriteBackImages, bool);
00087   vtkGetMacro(WriteBackImages, bool);
00088   vtkBooleanMacro(WriteBackImages, bool);
00090 
00092 
00096   vtkSetMacro(RootProcessId, int);
00097   vtkGetMacro(RootProcessId, int);
00099 
00105   void CollectiveExpandForVisiblePropBounds(double bounds[6]);
00106 
00108 
00110   virtual void SetCaptureDelegate(vtkSynchronizedRenderers*);
00111   vtkGetObjectMacro(CaptureDelegate, vtkSynchronizedRenderers);
00113 
00115 
00121   vtkSetMacro(AutomaticEventHandling, bool);
00122   vtkGetMacro(AutomaticEventHandling, bool);
00123   vtkBooleanMacro(AutomaticEventHandling, bool);
00125 
00126 //BTX
00127   enum
00128     {
00129     SYNC_RENDERER_TAG = 15101,
00130     RESET_CAMERA_TAG  = 15102,
00131     COMPUTE_BOUNDS_TAG = 15103
00132     };
00133 
00136   struct VTKRENDERINGPARALLEL_EXPORT vtkRawImage
00137     {
00138   public:
00139     vtkRawImage()
00140       {
00141       this->Valid = false;
00142       this->Size[0] = this->Size[1] = 0;
00143       this->Data = vtkSmartPointer<vtkUnsignedCharArray>::New();
00144       }
00145 
00146     void Resize(int dx, int dy, int numcomps)
00147       {
00148       this->Valid = false;
00149       this->Allocate(dx, dy, numcomps);
00150       }
00151 
00153     void Initialize(int dx, int dy, vtkUnsignedCharArray* data);
00154 
00155     void MarkValid() { this->Valid = true; }
00156     void MarkInValid() { this->Valid = false; }
00157 
00158     bool IsValid() { return this->Valid; }
00159     int GetWidth() { return this->Size[0];}
00160     int GetHeight() { return this->Size[1];}
00161     vtkUnsignedCharArray* GetRawPtr()
00162       { return this->Data; }
00163 
00164     // Pushes the image to the viewport.
00165     bool PushToViewport(vtkRenderer*);
00166 
00167     // This is a raw version of PushToViewport() that assumes that the
00168     // glViewport() has already been setup externally.
00169     // the argument is optional for backwards compat with old OpenGL
00170     bool PushToFrameBuffer(vtkRenderer *ren = NULL);
00171 
00172     // Captures the image from the viewport.
00173     // This doesn't trigger a render, just captures what's currently there in
00174     // the active buffer.
00175     bool Capture(vtkRenderer*);
00176 
00177     // Save the image as a png. Useful for debugging.
00178     void SaveAsPNG(const char* filename);
00179 
00180   private:
00181     bool Valid;
00182     int Size[2];
00183     vtkSmartPointer<vtkUnsignedCharArray> Data;
00184 
00185     void Allocate(int dx, int dy, int numcomps);
00186     };
00187 //ETX
00188 protected:
00189   vtkSynchronizedRenderers();
00190   ~vtkSynchronizedRenderers();
00191 
00192   struct RendererInfo
00193     {
00194     int ImageReductionFactor;
00195     int Draw;
00196     int CameraParallelProjection;
00197     double Viewport[4];
00198     double CameraPosition[3];
00199     double CameraFocalPoint[3];
00200     double CameraViewUp[3];
00201     double CameraWindowCenter[2];
00202     double CameraClippingRange[2];
00203     double CameraViewAngle;
00204     double CameraParallelScale;
00205     double EyeTransformMatrix[16];
00206     double ModelTransformMatrix[16];
00207 
00208     // Save/restore the struct to/from a stream.
00209     void Save(vtkMultiProcessStream& stream);
00210     bool Restore(vtkMultiProcessStream& stream);
00211 
00212     void CopyFrom(vtkRenderer*);
00213     void CopyTo(vtkRenderer*);
00214     };
00215 
00216   // These methods are called on all processes as a consequence of corresponding
00217   // events being called on the renderer.
00218   virtual void HandleStartRender();
00219   virtual void HandleEndRender();
00220   virtual void HandleAbortRender() {}
00221 
00222   virtual void MasterStartRender();
00223   virtual void SlaveStartRender();
00224 
00225   virtual void MasterEndRender();
00226   virtual void SlaveEndRender();
00227 
00228   vtkMultiProcessController* ParallelController;
00229   vtkOpenGLRenderer* Renderer;
00230 
00236   virtual vtkRawImage& CaptureRenderedImage();
00237 
00241   void PushImageToScreen();
00242 
00243   vtkSynchronizedRenderers* CaptureDelegate;
00244   vtkRawImage ReducedImage;
00245   vtkRawImage FullImage;
00246 
00247   bool ParallelRendering;
00248   int ImageReductionFactor;
00249   bool WriteBackImages;
00250   int RootProcessId;
00251   bool AutomaticEventHandling;
00252 
00253 private:
00254   vtkSynchronizedRenderers(const vtkSynchronizedRenderers&); // Not implemented
00255   void operator=(const vtkSynchronizedRenderers&); // Not implemented
00256 
00257   class vtkObserver;
00258   vtkObserver* Observer;
00259   friend class vtkObserver;
00260 
00261   double LastViewport[4];
00262 };
00263 
00264 #endif
00265