def flush_render_buffer(): '''When running as a single process use the WindowToImage filter to force a framebuffer read. This bypasses driver optimizations that perform lazy rendering and allows you to get actual frame rates for a single process with a GPU. Multi-process doesn't need this since compositing forces the frame buffer read. ''' # If we're not using off-screen rendering then we can bypass this since # the frame buffer display will force a GL flush w = GetRenderView().SMProxy.GetRenderWindow() if not w.GetOffScreenRendering(): return from vtkmodules.vtkRenderingCore import vtkWindowToImageFilter from vtkmodules.vtkParallelCore import vtkMultiProcessController # If we're using MPI we can also bypass this since compositing will # for a GL flush controller = vtkMultiProcessController.GetGlobalController() if controller.GetNumberOfProcesses() > 1: return # Force a GL flush by retrieving the frame buffer image w2i = vtkWindowToImageFilter() w2i.ReadFrontBufferOff() w2i.ShouldRerenderOff() w2i.SetInput(w) w2i.Modified() w2i.Update()
def flush_render_buffer(): '''When running as a single process use the WindowToImage filter to force a framebuffer read. This bypasses driver optimizations that perform lazy rendering and allows you to get actual frame rates for a single process with a GPU. Multi-process doesn't need this since compositing forces the frame buffer read. ''' # If we're not using off-screen rendering then we can bypass this since # the frame buffer display will force a GL flush w = GetRenderView().SMProxy.GetRenderWindow() if not w.GetOffScreenRendering(): return from vtkmodules.vtkParallelCore import vtkMultiProcessController from vtkmodules.vtkRenderingCore import vtkWindowToImageFilter # If we're using MPI we can also bypass this since compositing will # for a GL flush controller = vtkMultiProcessController.GetGlobalController() if controller.GetNumberOfProcesses() > 1: return # Force a GL flush by retrieving the frame buffer image w2i = vtkWindowToImageFilter() w2i.ReadFrontBufferOff() w2i.ShouldRerenderOff() w2i.SetInput(w) w2i.Modified() w2i.Update()
def save_render_buffer(fname): '''Similar to SaveScreenshot except a re-render will not be triggered''' from vtkmodules.vtkRenderingCore import vtkWindowToImageFilter w = GetRenderView().SMProxy.GetRenderWindow() w2i = vtkWindowToImageFilter() w2i.ReadFrontBufferOff() w2i.ShouldRerenderOff() w2i.SetInput(w) w2i.Modified() tiff = TIFFWriter() tiff.Input = w2i.GetOutput() tiff.FileName = fname tiff.UpdatePipeline()
def save_render_buffer(fname): '''Similar to SaveScreenshot except a re-render will not be triggered''' from vtkmodules.vtkRenderingCore import vtkWindowToImageFilter w = GetRenderView().SMProxy.GetRenderWindow() w2i = vtkWindowToImageFilter() w2i.ReadFrontBufferOff() w2i.ShouldRerenderOff() w2i.SetInput(w) w2i.Modified() png = PNGWriter() png.Input = w2i.GetOutput() png.FileName = fname png.UpdatePipeline()
def vtkRegressionTestImage( renWin ): """vtkRegressionTestImage(renWin) -- produce regression image for window This function writes out a regression .png file for a vtkWindow. Does anyone involved in testing care to elaborate? """ from vtkmodules.vtkRenderingCore import vtkWindowToImageFilter from vtkmodules.vtkIOImage import vtkPNGReader from vtkmodules.vtkImagingCore import vtkImageDifference imageIndex=-1; for i in range(0, len(sys.argv)): if sys.argv[i] == '-V' and i < len(sys.argv)-1: imageIndex = i+1 if imageIndex != -1: fname = os.path.join(vtkGetDataRoot(), sys.argv[imageIndex]) rt_w2if = vtkWindowToImageFilter() rt_w2if.SetInput(renWin) if os.path.isfile(fname): pass else: rt_pngw = vtkPNGWriter() rt_pngw.SetFileName(fname) rt_pngw.SetInputConnection(rt_w2if.GetOutputPort()) rt_pngw.Write() rt_pngw = None rt_png = vtkPNGReader() rt_png.SetFileName(fname) rt_id = vtkImageDifference() rt_id.SetInputConnection(rt_w2if.GetOutputPort()) rt_id.SetImageConnection(rt_png.GetOutputPort()) rt_id.Update() if rt_id.GetThresholdedError() <= 10: return 1 else: sys.stderr.write('Failed image test: %f\n' % rt_id.GetThresholdedError()) return 0 return 2
def vtkRegressionTestImage(renWin): """vtkRegressionTestImage(renWin) -- produce regression image for window This function writes out a regression .png file for a vtkWindow. Does anyone involved in testing care to elaborate? """ from vtkmodules.vtkRenderingCore import vtkWindowToImageFilter from vtkmodules.vtkIOImage import vtkPNGReader from vtkmodules.vtkImagingCore import vtkImageDifference imageIndex = -1 for i in range(0, len(sys.argv)): if sys.argv[i] == '-V' and i < len(sys.argv) - 1: imageIndex = i + 1 if imageIndex != -1: fname = os.path.join(vtkGetDataRoot(), sys.argv[imageIndex]) rt_w2if = vtkWindowToImageFilter() rt_w2if.SetInput(renWin) if os.path.isfile(fname): pass else: rt_pngw = vtkPNGWriter() rt_pngw.SetFileName(fname) rt_pngw.SetInputConnection(rt_w2if.GetOutputPort()) rt_pngw.Write() rt_pngw = None rt_png = vtkPNGReader() rt_png.SetFileName(fname) rt_id = vtkImageDifference() rt_id.SetInputConnection(rt_w2if.GetOutputPort()) rt_id.SetImageConnection(rt_png.GetOutputPort()) rt_id.Update() if rt_id.GetThresholdedError() <= 10: return 1 else: sys.stderr.write('Failed image test: %f\n' % rt_id.GetThresholdedError()) return 0 return 2
def compareImage(renwin, img_fname, threshold=10): """Compares renwin's (a vtkRenderWindow) contents with the image file whose name is given in the second argument. If the image file does not exist the image is generated and stored. If not the image in the render window is compared to that of the figure. This function also handles multiple images and finds the best matching image. """ global _NO_IMAGE if _NO_IMAGE: return w2if = vtkWindowToImageFilter() w2if.ReadFrontBufferOff() w2if.SetInput(renwin) w2if.Update() try: compareImageWithSavedImage(w2if, img_fname, threshold) except RuntimeError: w2if.ReadFrontBufferOn() compareImageWithSavedImage(w2if, img_fname, threshold) return
def __init__(self, magnification=1): self.windowToImage = vtkWindowToImageFilter() self.windowToImage.SetScale(magnification) self.windowToImage.SetInputBufferTypeToRGB() self.windowToImage.ReadFrontBufferOn() self.writer = None
def prepareTestImage(self, interactor, **kwargs): import time startTime = time.time() events = [] def onKeyPress(caller, eventId): print('key is "' + caller.GetKeySym() + '"') events.append((time.time() - startTime, eventId, caller.GetKeySym())) def onButton(caller, eventId): events.append((time.time() - startTime, eventId)) def onMovement(caller, eventId): events.append((time.time() - startTime, eventId, caller.GetEventPosition())) interactor.AddObserver(vtkCommand.KeyPressEvent, onKeyPress) interactor.AddObserver(vtkCommand.LeftButtonPressEvent, onButton) interactor.AddObserver(vtkCommand.LeftButtonReleaseEvent, onButton) interactor.AddObserver(vtkCommand.MouseMoveEvent, onMovement) interactor.Start() rw = interactor.GetRenderWindow() baseline = 'baselineFilename' if 'filename' in kwargs: # Render an image and save it to the given filename w2if = vtkWindowToImageFilter() w2if.ReadFrontBufferOff() w2if.SetInput(rw) w2if.Update() baselineWithPath = kwargs['filename'] baseline = os.path.split(baselineWithPath)[-1] pngw = vtkPNGWriter() pngw.SetFileName(baselineWithPath) pngw.SetInputConnection(w2if.GetOutputPort()) try: pngw.Write() except RuntimeError: w2if.ReadFrontBufferOn() pngw.Write() rsz = rw.GetSize() rrc = rw.GetRenderers() rrs = [rrc.GetItemAsObject(i) for i in range(rrc.GetNumberOfItems())] eye = [0,0,1] aim = [0,0,0] up = [0,1,0] if len(rrs) > 0: cam = rrs[0].GetActiveCamera() eye = cam.GetPosition() aim = cam.GetFocalPoint() up = cam.GetViewUp() print(""" Replace prepareTestImage() in your script with the following to make a test: camera.SetPosition({eye[0]}, {eye[1]}, {eye[2]}) camera.SetFocalPoint({aim[0]}, {aim[1]}, {aim[2]}) camera.SetViewUp({up[0]}, {up[1]}, {up[2]}) renwin.SetSize({rsz[0]}, {rsz[1]}) self.assertImageMatch(renwin, '{baseline}') Be sure that "renwin" and "camera" are valid variables (or rename them in the snippet above) referencing the vtkRenderWindow and vtkCamera, respectively. """.format(eye=eye, aim=aim, up=up, rsz=rsz, baseline=baseline)) return events