def render(self, gltf, nodes, window_size=(800, 600)):
     self.vr_compositor.waitGetPoses(self.poses, openvr.k_unMaxTrackedDeviceCount, None, 0)
     hmd_pose = self.poses[openvr.k_unTrackedDeviceIndex_Hmd]
     if not hmd_pose.bPoseIsValid:
         return
     hmd_34 = np.ctypeslib.as_array(cast(hmd_pose.mDeviceToAbsoluteTracking.m, c_float_p),
                                    shape=(3,4))
     self.view[:3,:] = hmd_34
     view = np.linalg.inv(self.view.T)
     view.dot(self.eye_transforms[0], out=self.view_matrices[0])
     view.dot(self.eye_transforms[1], out=self.view_matrices[1])
     gl.glViewport(0, 0, self.vr_framebuffers[0].width, self.vr_framebuffers[0].height)
     for eye in (0, 1):
         gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, self.vr_framebuffers[eye].fb)
         gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
         gltfu.set_material_state.current_material = None
         gltfu.set_technique_state.current_technique = None
         for node in nodes:
             gltfu.draw_node(node, gltf,
                             projection_matrix=self.projection_matrices[eye],
                             view_matrix=self.view_matrices[eye])
         self.controllers.display_gl(self.view_matrices[eye], self.projection_matrices[eye])
     self.vr_compositor.submit(openvr.Eye_Left, self.vr_framebuffers[0].texture)
     self.vr_compositor.submit(openvr.Eye_Right, self.vr_framebuffers[1].texture)
     # mirror left eye framebuffer to screen:
     gl.glBlitNamedFramebuffer(self.vr_framebuffers[0].fb, 0,
                               0, 0, self.vr_framebuffers[0].width, self.vr_framebuffers[0].height,
                               0, 0, window_size[0], window_size[1],
                               gl.GL_COLOR_BUFFER_BIT, gl.GL_NEAREST)
     gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0)
 def render(self, gltf, nodes, window_size=(800, 600)):
     self.vr_compositor.waitGetPoses(self.poses,
                                     openvr.k_unMaxTrackedDeviceCount, None,
                                     0)
     hmd_pose = self.poses[openvr.k_unTrackedDeviceIndex_Hmd]
     if not hmd_pose.bPoseIsValid:
         return
     hmd_34 = np.ctypeslib.as_array(cast(
         hmd_pose.mDeviceToAbsoluteTracking.m, c_float_p),
                                    shape=(3, 4))
     self.view[:3, :] = hmd_34
     view = np.linalg.inv(self.view.T)
     view.dot(self.eye_transforms[0], out=self.view_matrices[0])
     view.dot(self.eye_transforms[1], out=self.view_matrices[1])
     gl.glViewport(0, 0, self.vr_framebuffers[0].width,
                   self.vr_framebuffers[0].height)
     for eye in (0, 1):
         gl.glBindFramebuffer(gl.GL_FRAMEBUFFER,
                              self.vr_framebuffers[eye].fb)
         gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
         gltfu.set_material_state.current_material = None
         gltfu.set_technique_state.current_technique = None
         for node in nodes:
             gltfu.draw_node(
                 node,
                 gltf,
                 projection_matrix=self.projection_matrices[eye],
                 view_matrix=self.view_matrices[eye])
         self.controllers.display_gl(self.view_matrices[eye],
                                     self.projection_matrices[eye])
     self.vr_compositor.submit(openvr.Eye_Left,
                               self.vr_framebuffers[0].texture)
     self.vr_compositor.submit(openvr.Eye_Right,
                               self.vr_framebuffers[1].texture)
     # mirror left eye framebuffer to screen:
     gl.glBlitNamedFramebuffer(self.vr_framebuffers[0].fb, 0, 0, 0,
                               self.vr_framebuffers[0].width,
                               self.vr_framebuffers[0].height, 0, 0,
                               window_size[0], window_size[1],
                               gl.GL_COLOR_BUFFER_BIT, gl.GL_NEAREST)
     gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0)