Skip to content

OffscreenRenderer doesn't propagate size correctly. #1180

Open
@gestj

Description

@gestj

The function init_display provides a size parameter which is meant for the screen size of the created and returned display/renderer (however you wanna call it).

BUT, in case of offscreen rendering (env.PYTHONOCC_OFFSCREEN_RENDERER = 1) the size isn't propagated correctly. Instead a default of 640x480 will be used ALWAYS. This is unexpected.

I use now my own implementation which is more or less c&p of your OffscreenRenderer including overwriting the Viewer3d and there the InitOffscreen (where I ignore its parameters and instead call its super method with the size I want to set) method because that was the most straight forward hack for me.

In Viewer3d.Create https://github.com/tpaviot/pythonocc-core/blob/master/src/Display/OCCViewer.py#L203 you can see that even if OffscreenRenderer would consider size correctly (in fact it does consider it a "little" bit; see its constructor) it wouldn't work as expected.

Overall the code is just wired incorrectly for this use case...

I might be able to provide a fix if you want, but, I am unsure how activly this entire repo is maintained anyway... So I won't spend time upfront on this since I am very very very busy with my own stuff.

The hack looks like this btw:

# Patched version of pyocc because it doesn't delegate screen size correctly.
class OffscreenRenderer(Viewer3d):
    _size: Tuple[int, int]

    # essentially same code as pyocc version, only I left out what I don't need anyway
    def __init__(self, size=(1920, 1080)):
        Viewer3d.__init__(self)
        self._size = size
        self.Create()
        self.SetModeShaded()
        self.capture_number = 0

    def InitOffscreen(self, size_x: "int", size_y: "int") -> "bool":
        # this is the reason why I patched it ...
        return Viewer3d.InitOffscreen(self, self._size[0], self._size[1])


# I needed to patch the pyocc version since it misses passing the size to the `OffscreenRenderer`
def init_display_patched(size=(1920, 1080)):
    if os.getenv("PYTHONOCC_OFFSCREEN_RENDERER") == "1":
        print(f"Using offscreen renderer with {size}")
        offscreen_renderer = OffscreenRenderer(size=size)

        def do_nothing(*kargs: Any, **kwargs: Any) -> None:
            """takes as many parameters as you want, and does nothing
            """
            return None

        def call_function(s, func: Callable) -> None:
            """A function that calls another function.
            Helpful to bypass add_function_to_menu. s should be a string
            """
            check_callable(func)
            print("Execute %s :: %s menu function" % (s, func.__name__))
            func()
            print("done")

        # returns empty classes and functions
        return offscreen_renderer, do_nothing, do_nothing, call_function
    return init_display(size=size, display_triedron=False)

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions