def create_gnomon_camera(self, main_camera): """ Creates a camera for observing the gnomon. Borrows some settings from the main camera. :param main_camera: The main camera that views the instrument components. :return: The gnomon camera. """ aspect = 1 near_plane = 0.1 # Set far plane so that the camera can see the gnomon even when it is turned "behind" it and the cylinders are # facing away from the camera. far_plane = 25 gnomon_camera = Qt3DRender.QCamera() gnomon_camera.setParent(self.gnomon_root_entity) gnomon_camera.setProjectionType(main_camera.projectionType()) gnomon_camera.lens().setPerspectiveProjection( main_camera.fieldOfView(), aspect, near_plane, far_plane) gnomon_camera.setUpVector(main_camera.upVector()) gnomon_camera.setViewCenter(QVector3D(0, 0, 0)) return gnomon_camera
def __init__(self, window): self.window = window self.offscreenSurface = QOffscreenSurface() sformat = QSurfaceFormat.defaultFormat() sformat.setDepthBufferSize(32) self.offscreenSurface.setFormat( sformat ) self.offscreenSurface.create() self.overlayCamera = Qt3DRender.QCamera() self.overlayCamera.setViewCenter( vec3d() ) self.overlayCamera.setPosition( vec3d( 0, 0, -1 ) ) self.overlayCamera.setUpVector( vec3d( 0, 1, 0 ) ) self.overlayCamera.lens().setOrthographicProjection( -1, 1, -1, 1, -1, 1 ) # Framegraph root #1 -- onscreen rendering self.surfaceSelector = Qt3DRender.QRenderSurfaceSelector() self.surfaceSelector.setSurface(window) self.root = self.surfaceSelector # Framgraph root #2 -- Used for offscreen renders, not in the graph by default # During screenshots, offscreenSurfaceSelector becomes the root # and the branch roots will become a child of renderTargetSelector self.offscreenSurfaceSelector = Qt3DRender.QRenderSurfaceSelector() self.offscreenSurfaceSelector.setSurface(self.offscreenSurface) self.renderTargetSelector = Qt3DRender.QRenderTargetSelector(self.offscreenSurfaceSelector) self.targetTexture = OffscreenRenderTarget(self.renderTargetSelector) self.renderTargetSelector.setTarget(self.targetTexture) self.noDraw2 = Qt3DRender.QNoDraw(self.renderTargetSelector) # Branch 1: clear buffers self.clearBuffers = Qt3DRender.QClearBuffers(self.surfaceSelector) self.clearBuffers.setBuffers(Qt3DRender.QClearBuffers.ColorDepthBuffer) self.clearBuffers.setClearColor(Qt.white) self.noDraw = Qt3DRender.QNoDraw(self.clearBuffers) # Branch 2: main drawing branches using the Athena camera self.cameraSelector = Qt3DRender.QCameraSelector(self.surfaceSelector) self.cameraSelector.setCamera(window.camera()) # Branch 2A: solid objects self.viewport = Qt3DRender.QViewport(self.cameraSelector) self.viewport.setNormalizedRect(QRectF(0, 0, 1.0, 1.0)) self.qfilt = Qt3DRender.QTechniqueFilter(self.viewport) self.solidPassFilter = Qt3DRender.QFilterKey(self.qfilt) self.solidPassFilter.setName('pass') self.solidPassFilter.setValue('solid') self.qfilt.addMatch(self.solidPassFilter) # Branch 2B: transparent objects self.viewport2 = Qt3DRender.QViewport(self.cameraSelector) self.viewport2.setNormalizedRect(QRectF(0, 0, 1.0, 1.0)) self.qfilt2 = Qt3DRender.QTechniqueFilter(self.viewport2) self.transPassFilter = Qt3DRender.QFilterKey(self.qfilt2) self.transPassFilter.setName('pass') self.transPassFilter.setValue('transp') self.qfilt2.addMatch(self.transPassFilter) # Branch 3: 2D screen overlays self.cameraSelector2 = Qt3DRender.QCameraSelector(self.surfaceSelector) self.cameraSelector2.setCamera(self.overlayCamera) self.viewport3 = Qt3DRender.QViewport(self.cameraSelector2) self.viewport3.setNormalizedRect(QRectF(0, 0, 1.0, 1.0)) self.qfilt3 = Qt3DRender.QTechniqueFilter(self.viewport3) self.overlayPassFilter = Qt3DRender.QFilterKey(self.viewport3) self.overlayPassFilter.setName('pass') self.overlayPassFilter.setValue('overlay') self.qfilt3.addMatch(self.overlayPassFilter) # Branch 4: render capture branch for taking screenshots self.renderCapture = Qt3DRender.QRenderCapture(self.surfaceSelector) self.noDraw3 = Qt3DRender.QNoDraw(self.renderCapture) # Branch roots are the bits that need reparenting when switching between # offscreen and onscreen rendering self.branchRoots = [ self.clearBuffers, self.cameraSelector, self.cameraSelector2, self.renderCapture ]