"""Renderer backend selection for the render-bridge scripts. Default = the dpl3-revive GPU backend (vrview_gl.GLRenderer, moderngl); VRVIEW_SOFT=1 forces the software rasterizer (vrview.Renderer), which stays the debugging reference. Both share SceneCache/cam_matrix/draw/last_frame, so scripts only swap the class. Run under the Windows CPython with the wheels installed (py -3.13): numpy pygame-ce moderngl pillow (the MSYS2 python has no pip; 3.14 has no moderngl/glcontext wheel yet). """ import os import sys sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..', 'dpl3-revive', 'patha')) def pick_renderer(): """Return (RendererClass, backend_name).""" if os.environ.get('VRVIEW_SOFT') == '1': from vrview import Renderer return Renderer, 'software' try: from vrview_gl import GLRenderer return GLRenderer, 'GL' except Exception as e: print(f"GL backend unavailable ({e}); using software rasterizer", file=sys.stderr) from vrview import Renderer return Renderer, 'software' def save_frame(r, out): """Save the last rendered frame. Works headless on both backends (GL has no screen surface -- read the FBO via last_frame).""" arr = r.last_frame if arr is None: raise RuntimeError('no frame rendered yet') from PIL import Image Image.fromarray(arr).save(out)