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 "vtkObject.h" 00036 #include "vtkUnsignedCharArray.h" // needed for vtkUnsignedCharArray. 00037 #include "vtkSmartPointer.h" // needed for vtkSmartPointer. 00038 00039 class vtkRenderer; 00040 class vtkMultiProcessController; 00041 class vtkMultiProcessStream; 00042 00043 class VTK_PARALLEL_EXPORT vtkSynchronizedRenderers : public vtkObject 00044 { 00045 public: 00046 static vtkSynchronizedRenderers* New(); 00047 vtkTypeMacro(vtkSynchronizedRenderers, vtkObject); 00048 void PrintSelf(ostream& os, vtkIndent indent); 00049 00051 00055 virtual void SetRenderer(vtkRenderer*); 00056 vtkGetObjectMacro(Renderer, vtkRenderer); 00058 00060 00062 virtual void SetParallelController(vtkMultiProcessController*); 00063 vtkGetObjectMacro(ParallelController, vtkMultiProcessController); 00065 00067 00069 vtkSetMacro(ParallelRendering, bool); 00070 vtkGetMacro(ParallelRendering, bool); 00071 vtkBooleanMacro(ParallelRendering, bool); 00073 00075 00076 vtkSetClampMacro(ImageReductionFactor, int, 1, 50); 00077 vtkGetMacro(ImageReductionFactor, int); 00079 00081 00084 vtkSetMacro(WriteBackImages, bool); 00085 vtkGetMacro(WriteBackImages, bool); 00086 vtkBooleanMacro(WriteBackImages, bool); 00088 00090 00094 vtkSetMacro(RootProcessId, int); 00095 vtkGetMacro(RootProcessId, int); 00097 00103 void CollectiveExpandForVisiblePropBounds(double bounds[6]); 00104 00106 00108 virtual void SetCaptureDelegate(vtkSynchronizedRenderers*); 00109 vtkGetObjectMacro(CaptureDelegate, vtkSynchronizedRenderers); 00111 00113 00119 vtkSetMacro(AutomaticEventHandling, bool); 00120 vtkGetMacro(AutomaticEventHandling, bool); 00121 vtkBooleanMacro(AutomaticEventHandling, bool); 00123 00124 //BTX 00125 enum 00126 { 00127 SYNC_RENDERER_TAG = 15101, 00128 RESET_CAMERA_TAG = 15102, 00129 COMPUTE_BOUNDS_TAG = 15103 00130 }; 00131 00134 struct VTK_PARALLEL_EXPORT vtkRawImage 00135 { 00136 public: 00137 vtkRawImage() 00138 { 00139 this->Valid = false; 00140 this->Size[0] = this->Size[1] = 0; 00141 this->Data = vtkSmartPointer<vtkUnsignedCharArray>::New(); 00142 } 00143 00144 void Resize(int dx, int dy, int numcomps) 00145 { 00146 this->Valid = false; 00147 this->Allocate(dx, dy, numcomps); 00148 } 00149 00151 void Initialize(int dx, int dy, vtkUnsignedCharArray* data); 00152 00153 void MarkValid() { this->Valid = true; } 00154 void MarkInValid() { this->Valid = false; } 00155 00156 bool IsValid() { return this->Valid; } 00157 int GetWidth() { return this->Size[0];} 00158 int GetHeight() { return this->Size[1];} 00159 vtkUnsignedCharArray* GetRawPtr() 00160 { return this->Data; } 00161 00162 // Pushes the image to the viewport. 00163 bool PushToViewport(vtkRenderer*); 00164 00165 // This is a raw version of PushToViewport() that assumes that the 00166 // glViewport() has already been setup externally. 00167 bool PushToFrameBuffer(); 00168 00169 // Captures the image from the viewport. 00170 // This doesn't trigger a render, just captures what's currently there in 00171 // the active buffer. 00172 bool Capture(vtkRenderer*); 00173 00174 // Save the image as a png. Useful for debugging. 00175 void SaveAsPNG(const char* filename); 00176 00177 private: 00178 bool Valid; 00179 int Size[2]; 00180 vtkSmartPointer<vtkUnsignedCharArray> Data; 00181 00182 void Allocate(int dx, int dy, int numcomps); 00183 }; 00184 //ETX 00185 protected: 00186 vtkSynchronizedRenderers(); 00187 ~vtkSynchronizedRenderers(); 00188 00189 struct RendererInfo 00190 { 00191 int ImageReductionFactor; 00192 int Draw; 00193 int CameraParallelProjection; 00194 double Viewport[4]; 00195 double CameraPosition[3]; 00196 double CameraFocalPoint[3]; 00197 double CameraViewUp[3]; 00198 double CameraWindowCenter[2]; 00199 double CameraClippingRange[2]; 00200 double CameraViewAngle; 00201 double CameraParallelScale; 00202 double HeadPose[16]; 00203 double WandPose[16]; 00204 00205 // Save/restore the struct to/from a stream. 00206 void Save(vtkMultiProcessStream& stream); 00207 bool Restore(vtkMultiProcessStream& stream); 00208 00209 void CopyFrom(vtkRenderer*); 00210 void CopyTo(vtkRenderer*); 00211 }; 00212 00213 // These methods are called on all processes as a consequence of corresponding 00214 // events being called on the renderer. 00215 virtual void HandleStartRender(); 00216 virtual void HandleEndRender(); 00217 virtual void HandleAbortRender() {} 00218 00219 virtual void MasterStartRender(); 00220 virtual void SlaveStartRender(); 00221 00222 virtual void MasterEndRender(); 00223 virtual void SlaveEndRender(); 00224 00225 vtkMultiProcessController* ParallelController; 00226 vtkRenderer* Renderer; 00227 00233 virtual vtkRawImage& CaptureRenderedImage(); 00234 00238 void PushImageToScreen(); 00239 00240 vtkSynchronizedRenderers* CaptureDelegate; 00241 vtkRawImage ReducedImage; 00242 vtkRawImage FullImage; 00243 00244 bool ParallelRendering; 00245 int ImageReductionFactor; 00246 bool WriteBackImages; 00247 int RootProcessId; 00248 bool AutomaticEventHandling; 00249 00250 private: 00251 vtkSynchronizedRenderers(const vtkSynchronizedRenderers&); // Not implemented 00252 void operator=(const vtkSynchronizedRenderers&); // Not implemented 00253 00254 class vtkObserver; 00255 vtkObserver* Observer; 00256 friend class vtkObserver; 00257 00258 double LastViewport[4]; 00259 }; 00260 00261 #endif 00262