@@ -34,6 +34,7 @@ def __init__(self, point_size=1.0, pyopengl_platform="pyglet", seg_node_map=None
3434 self .point_size = point_size
3535 self ._platform = None
3636 self ._is_software = False
37+ self ._has_valid_context = False
3738 self ._create (pyopengl_platform )
3839 self ._seg_node_map = seg_node_map
3940
@@ -66,6 +67,38 @@ def point_size(self):
6667 def point_size (self , value ):
6768 self ._point_size = float (value )
6869
70+ def make_current (self ):
71+ """This function sets the current context and must be called before all rendering and GPU upload operations.
72+ """
73+ if self ._has_valid_context :
74+ gs .raise_exception ("The method was called while having an other context current. Please call 'make_uncurrent' first." )
75+
76+ self ._platform .make_current ()
77+
78+ # If platform does not support dynamically-resizing framebuffers,
79+ # destroy it and restart it
80+ if (
81+ self ._platform .viewport_height != self .viewport_height
82+ or self ._platform .viewport_width != self .viewport_width
83+ ):
84+ if not self ._platform .supports_framebuffers ():
85+ self .delete ()
86+ self ._create ()
87+
88+ # Only needs to happen if the context was deleted and created
89+ self ._platform .make_current ()
90+
91+ self ._has_valid_context = True
92+
93+ def make_uncurrent (self ):
94+ """This function unsets the current context and must be called after all rendering and GPU upload operations
95+ are done.
96+ """
97+ if not self ._has_valid_context :
98+ gs .raise_exception ("The method was called before making a context current." )
99+ self ._platform .make_uncurrent ()
100+ self ._has_valid_context = False
101+
69102 def render (
70103 self ,
71104 scene ,
@@ -97,24 +130,13 @@ def render(
97130 depth_im : (h, w) float32
98131 The depth buffer in linear units.
99132 """
133+ if not self ._has_valid_context :
134+ gs .raise_exception ("Ensure that the right context is set before rendering. Please call the method 'make_current'." )
100135
101136 if camera_node is not None :
102137 saved_camera_node = scene .main_camera_node
103138 scene .main_camera_node = camera_node
104139
105- self ._platform .make_current ()
106- # If platform does not support dynamically-resizing framebuffers,
107- # destroy it and restart it
108- if (
109- self ._platform .viewport_height != self .viewport_height
110- or self ._platform .viewport_width != self .viewport_width
111- ):
112- if not self ._platform .supports_framebuffers ():
113- self .delete ()
114- self ._create ()
115-
116- self ._platform .make_current ()
117-
118140 # Forcibly disable shadow for software rendering as it may hang indefinitely
119141 if shadow and not self ._is_software :
120142 flags |= RenderFlags .SHADOWS_ALL
@@ -172,9 +194,6 @@ def get_program(self, vertex_shader, fragment_shader, geometry_shader=None, defi
172194
173195 renderer ._program_cache = old_cache
174196
175- # Make the platform not current
176- self ._platform .make_uncurrent ()
177-
178197 if camera_node is not None :
179198 scene .main_camera_node = saved_camera_node
180199
0 commit comments