code: def draw(self):
      self.plot._render_lock.acquire()
      self.camera.apply_transformation()
  
      calc_verts_pos, calc_verts_len = 0, 0
      calc_cverts_pos, calc_cverts_len = 0, 0
  
      should_update_caption = (
          perf_counter() - self.last_caption_update
          > self.caption_update_interval
      )
  
      if len(self.plot._functions.values()) == 0:
          self.drawing_first_object = True
  
      iterfunctions = iter(self.plot._functions.values())
  
      for r in iterfunctions:
          if self.drawing_first_object:
              self.camera.set_rot_preset(r.default_rot_preset)
              self.drawing_first_object = False
  
          pgl.glPushMatrix()
          r._draw()
          pgl.glPopMatrix()
  
          # might as well do this while we are
          # iterating and have the lock rather
          # than locking and iterating twice
          # per frame:
  
          if should_update_caption:
              try:
                  if r.calculating_verts:
                      calc_verts_pos += r.calculating_verts_pos
                      calc_verts_len += r.calculating_verts_len
                  if r.calculating_cverts:
                      calc_cverts_pos += r.calculating_cverts_pos
                      calc_cverts_len += r.calculating_cverts_len
              except ValueError:
                  pass
  
      for r in self.plot._pobjects:
          pgl.glPushMatrix()
          r._draw()
          pgl.glPopMatrix()
  
      if should_update_caption:
          self.update_caption(
              calc_verts_pos,
              calc_verts_len,
              calc_cverts_pos,
              calc_cverts_len,
          )
          self.last_caption_update = perf_counter()
  
      if self.plot._screenshot:
          self.plot._screenshot._execute_saving()
  
      self.plot._render_lock.release()
  
file_path: sympy/sympy/plotting/pygletplot/plot_window.py
imports: from time import perf_counter
  import pyglet.gl
  from sympy.plotting.pygletplot.managed_window import ManagedWindow
  from sympy.plotting.pygletplot.plot_camera import PlotCamera
  from sympy.plotting.pygletplot.plot_controller import PlotController
label_desc: Use image node_id 5 for calling the PlotWindow obj's underlying member method code with example usage: obj.draw() without return types