VTK
|
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