Exemplo n.º 1
0
def test_ctx_ownership():
    viewer = ngl.Viewer()
    viewer2 = ngl.Viewer()
    assert viewer.configure(offscreen=1, width=16, height=16) == 0
    assert viewer2.configure(offscreen=1, width=16, height=16) == 0
    scene = ngl.Render(ngl.Quad())
    viewer.set_scene(scene)
    viewer.draw(0)
    assert viewer2.set_scene(scene) != 0
    viewer2.draw(0)
    del viewer
    del viewer2
Exemplo n.º 2
0
 def _init_viewer(self, rendering_backend):
     if self._viewer:
         return
     self._viewer = ngl.Viewer()
     self._viewer.configure(backend=misc.get_backend(rendering_backend),
                            offscreen=1,
                            width=16,
                            height=16)
Exemplo n.º 3
0
def test_ctx_ownership_subgraph():
    for shared in (True, False):
        viewer = ngl.Viewer()
        viewer2 = ngl.Viewer()
        assert viewer.configure(offscreen=1, width=16, height=16) == 0
        assert viewer2.configure(offscreen=1, width=16, height=16) == 0
        quad = ngl.Quad()
        render1 = ngl.Render(quad)
        if not shared:
            quad = ngl.Quad()
        render2 = ngl.Render(quad)
        scene = ngl.Group([render1, render2])
        viewer.set_scene(render2)
        viewer.draw(0)
        assert viewer2.set_scene(scene) != 0
        viewer2.draw(0)
        del viewer
        del viewer2
Exemplo n.º 4
0
def test_reconfigure_fail():
    viewer = ngl.Viewer()
    assert viewer.configure(offscreen=1, width=16, height=16) == 0
    scene = ngl.Render(ngl.Quad())
    viewer.set_scene(scene)
    viewer.draw(0)
    assert viewer.configure(offscreen=0) != 0
    viewer.draw(1)
    del viewer
Exemplo n.º 5
0
def test_capture_buffer_lifetime(width=1024, height=1024):
    capture_buffer = bytearray(width * height * 4)
    viewer = ngl.Viewer()
    assert viewer.configure(offscreen=1, width=width, height=height, capture_buffer=capture_buffer) == 0
    del capture_buffer
    scene = ngl.Render(ngl.Quad())
    viewer.set_scene(scene)
    viewer.draw(0)
    del viewer
Exemplo n.º 6
0
def test_reconfigure():
    viewer = ngl.Viewer()
    assert viewer.configure(offscreen=1, width=16, height=16) == 0
    scene = ngl.Render(ngl.Quad())
    viewer.set_scene(scene)
    viewer.draw(0)
    assert viewer.configure(offscreen=1, width=16, height=16) == 0
    # FIXME: errors should be raised by the draw call so we can assert here
    viewer.draw(1)
    del viewer
Exemplo n.º 7
0
def api_hud(width=234, height=123):
    viewer = ngl.Viewer()
    assert viewer.configure(offscreen=1,
                            width=width,
                            height=height,
                            backend=_backend) == 0
    quad = ngl.Quad()
    render = ngl.Render(quad)
    scene = ngl.HUD(render)
    viewer.set_scene(scene)
    for i in range(60 * 3):
        viewer.draw(i / 60.)
    del viewer
Exemplo n.º 8
0
 def set_scene(self, cfg):
     with QtCore.QMutexLocker(self._mutex):
         self._scene = cfg['scene']
         self._framerate = cfg['framerate']
         self._duration = cfg['duration']
         self._clear_color = cfg['clear_color']
         self._aspect_ratio = cfg['aspect_ratio']
         self._samples = cfg['samples']
         if self._backend != cfg['backend']:
             self._backend = cfg['backend']
             self._viewer = ngl.Viewer()
         self._configure_viewer()
     self._push_event(lambda: self._set_scene())
Exemplo n.º 9
0
    def render_frames(self):
        # We make sure the lists of medias is explicitely empty. If we don't a
        # jobbed make on the tests will attempt concurrent generations of a
        # default ngl-media.mp4.
        idict = dict(medias=[])

        backend = os.environ.get('BACKEND')
        if backend:
            idict['backend'] = backend

        ret = self._scene_func(idict=idict, **self._scene_kwargs)
        width, height = self._width, self._height
        duration = ret['duration']
        scene = ret['scene']

        capture_buffer = bytearray(width * height * 4)
        viewer = ngl.Viewer()
        assert viewer.configure(
            offscreen=1,
            width=width,
            height=height,
            backend=get_backend(backend) if backend else ngl.BACKEND_AUTO,
            samples=self._samples,
            clear_color=self._clear_color,
            capture_buffer=capture_buffer) == 0
        timescale = duration / float(self._nb_keyframes)

        if self._scene_wrap:
            scene = self._scene_wrap(scene)

        if self._exercise_dot:
            assert scene.dot()

        if self._exercise_serialization:
            scene_str = scene.serialize()
            viewer.set_scene_from_string(scene_str)
        else:
            viewer.set_scene(scene)

        for t_id in range(self._nb_keyframes):
            if self._keyframes_callback:
                self._keyframes_callback(t_id)
            viewer.draw(t_id * timescale)

            yield (width, height, capture_buffer)

            if not self._exercise_serialization and self._exercise_dot:
                scene.dot()
Exemplo n.º 10
0
 def _set_scene(self, cfg):
     if cfg is None:
         self._pause()
         self._scene = None
         self._viewer.set_scene(None)
         return False
     self._scene = cfg['scene']
     self._framerate = cfg['framerate']
     self._duration = cfg['duration']
     self._clear_color = cfg['clear_color']
     self._aspect_ratio = cfg['aspect_ratio']
     if self._samples != cfg['samples'] or self._backend != cfg['backend']:
         self._samples = cfg['samples']
         self._backend = cfg['backend']
         self._viewer = ngl.Viewer()
     self._viewer.set_scene_from_string(self._scene)
     self._configure_viewer()
     self._clock.configure(self._framerate, self._duration)
     self.onSceneMetadata.emit({'framerate': self._framerate, 'duration': self._duration})
     return False
Exemplo n.º 11
0
    def __init__(self, window, width, height, config):
        super(Player, self).__init__()

        self._mutex = QtCore.QMutex()
        self._cond = QtCore.QWaitCondition()

        self._window = window
        self._width = width
        self._height = height

        self._scene = None
        self._framerate = config.get('framerate')
        self._duration = 0.0
        self._clear_color = config.get('clear_color')
        self._aspect_ratio = config.get('aspect_ratio')
        self._samples = config.get('samples')
        self._backend = config.get('backend')

        self._events = []
        self._wait_first_frame = True
        self._clock = Clock(self._framerate, self._duration)
        self._viewer = ngl.Viewer()
        self._configure_viewer()
Exemplo n.º 12
0
    def _export(self, filename, width, height, extra_enc_args=None):
        fd_r, fd_w = os.pipe()

        cfg = self._get_scene_func()
        if not cfg:
            self.failed.emit()
            return False

        fps = cfg['framerate']
        duration = cfg['duration']
        samples = cfg['samples']

        cmd = [
            'ffmpeg', '-r',
            '%d/%d' % fps, '-nostats', '-nostdin', '-f', 'rawvideo',
            '-video_size',
            '%dx%d' % (width, height), '-pixel_format', 'rgba', '-i',
            'pipe:%d' % fd_r
        ]
        if extra_enc_args:
            cmd += extra_enc_args
        cmd += ['-y', filename]

        def close_unused_child_fd():
            os.close(fd_w)

        def close_unused_parent_fd():
            os.close(fd_r)

        reader = subprocess.Popen(cmd,
                                  preexec_fn=close_unused_child_fd,
                                  close_fds=False)
        close_unused_parent_fd()

        capture_buffer = bytearray(width * height * 4)

        # node.gl context
        ngl_viewer = ngl.Viewer()
        ngl_viewer.configure(
            platform=ngl.PLATFORM_AUTO,
            backend=get_backend(cfg['backend']),
            offscreen=1,
            width=width,
            height=height,
            viewport=get_viewport(width, height, cfg['aspect_ratio']),
            samples=samples,
            clear_color=cfg['clear_color'],
            capture_buffer=capture_buffer,
        )
        ngl_viewer.set_scene_from_string(cfg['scene'])

        if self._time is not None:
            ngl_viewer.draw(self._time)
            os.write(fd_w, capture_buffer)
            self.progressed.emit(100)
        else:
            # Draw every frame
            nb_frame = int(duration * fps[0] / fps[1])
            for i in range(nb_frame):
                if self._cancelled:
                    break
                time = i * fps[1] / float(fps[0])
                ngl_viewer.draw(time)
                os.write(fd_w, capture_buffer)
                self.progressed.emit(i * 100 / nb_frame)
            self.progressed.emit(100)

        os.close(fd_w)
        reader.wait()
        return True
Exemplo n.º 13
0
def api_backend():
    viewer = ngl.Viewer()
    assert viewer.configure(backend=0x1234) < 0
    del viewer
Exemplo n.º 14
0
 def _set_backend(self, backend):
     self._backend = backend
     self._viewer = ngl.Viewer()
     self._configure_viewer()
     return False
Exemplo n.º 15
0
 def _set_samples(self, samples):
     self._samples = samples
     self._viewer = ngl.Viewer()
     self._configure_viewer()
     return False