Пример #1
0
    def __init__(self, image, overlayList, displayCtx, canvas, threedee):
        """Create a ``GLMask``.

        :arg image:       The :class:`.Image` instance.
        :arg overlayList: The :class:`.OverlayList`
        :arg displayCtx:  The :class:`.DisplayContext` managing the scene.
        :arg canvas:      The canvas doing the drawing.
        :arg threedee:    2D or 3D rendering
        """
        glimageobject.GLImageObject.__init__(self,
                                             image,
                                             overlayList,
                                             displayCtx,
                                             canvas,
                                             threedee)

        # The shader attribute will be created
        # by the glmask_funcs module
        self.shader        = None
        self.imageTexture  = None
        self.edgeFilter    = glfilter.Filter('edge', texture=1)
        self.renderTexture = textures.RenderTexture(
            self.name, interp=gl.GL_LINEAR, rttype='c')

        self.addDisplayListeners()
        self.refreshImageTexture()

        def init():
            fslgl.glmask_funcs.init(self)
            self.notify()

        idle.idleWhen(init, self.textureReady)
Пример #2
0
    def _updateRenderTextures(self):
        """Overrides :meth:`.SliceCanvas._updateRenderTextures`.
        Destroys/creates :class:`.RenderTexture` and
        :class:`.RenderTextureStack` instances as needed.
        """

        renderMode = self.opts.renderMode

        if renderMode == 'onscreen':
            return

        # The LightBoxCanvas does offscreen rendering
        # a bit different to the SliceCanvas. The latter
        # uses a separate render texture for each overlay
        # whereas here we're going to use a single
        # render texture for all overlays.
        elif renderMode == 'offscreen':
            if self._offscreenRenderTexture is not None:
                self._offscreenRenderTexture.destroy()

            self._offscreenRenderTexture = textures.RenderTexture(
                '{}_{}'.format(type(self).__name__, id(self)),
                interp=gl.GL_LINEAR)

            self._offscreenRenderTexture.shape = 768, 768

        # The LightBoxCanvas handles pre-render mode
        # the same way as the SliceCanvas - a separate
        # RenderTextureStack for eacn globject
        elif renderMode == 'prerender':

            # Delete any RenderTextureStack instances for
            # overlays which have been removed from the list
            for overlay, (tex, name) in list(self._prerenderTextures.items()):
                if overlay not in self.overlayList:
                    self._prerenderTextures.pop(overlay)
                    glresources.delete(name)

            # Create a RendeTextureStack for overlays
            # which have been added to the list
            for overlay in self.overlayList:
                if overlay in self._prerenderTextures:
                    continue

                globj = self._glObjects.get(overlay, None)

                if (globj is None) or (not globj):
                    continue

                rt, name = self._getPreRenderTexture(globj, overlay)
                self._prerenderTextures[overlay] = rt, name

        self.Refresh()
Пример #3
0
    def __init__(self, overlay, overlayList, displayCtx, canvas, threedee):
        """Create a ``GLMesh``.

        :arg overlay:     A :class:`.Mesh` overlay.
        :arg overlayList: The :class:`.OverlayList`
        :arg displayCtx:  The :class:`.DisplayContext` managing the scene.
        :arg canvas:      The canvas drawing this ``GLMesh``.
        :arg threedee:    2D or 3D rendering.
        """

        globject.GLObject.__init__(self, overlay, overlayList, displayCtx,
                                   canvas, threedee)

        self.flatShader = None
        self.dataShader = None
        self.activeShader = None

        # We use a render texture when
        # rendering model cross sections.
        # This texture is kept at display/
        # screen resolution
        self.renderTexture = textures.RenderTexture(self.name,
                                                    interp=gl.GL_NEAREST)

        # Mesh overlays are coloured:
        #
        #  - with a constant colour (opts.outline == False), or
        #
        #  - with a +/- colour map, (opts.vertexData not None), or
        #
        #  - with a lookup table (opts.useLut == True and
        #    opts.vertexData is not None)
        self.cmapTexture = textures.ColourMapTexture(self.name)
        self.negCmapTexture = textures.ColourMapTexture(self.name)
        self.lutTexture = textures.LookupTableTexture(self.name)

        self.lut = None

        self.registerLut()
        self.addListeners()
        self.updateVertices()
        self.refreshCmapTextures(notify=False)

        self.compileShaders()
        self.updateShaderState()