def render(self,
               r,
               t,
               light_position,
               light_intensity,
               class_name,
               brightness_k=0,
               r_type='quat'):
        '''
        :param r: 
        :param t: 
        :param light_position: 
        :param light_intensity: 
        :param brightness_k: choose which brightness in __init__ 
        :param r_type: 
        :return: 
        '''
        if r_type == 'quat':
            R = RT_transform.quat2mat(r)
        elif r_type == 'mat':
            R = r
        self.class_name = class_name
        self.brightness_k = brightness_k
        self.render_kernels[
            self.class_name][brightness_k]['u_view'] = self._get_view_mtx(
                R, t)
        self.render_kernels[
            self.class_name][brightness_k]['u_light_position'] = light_position
        self.render_kernels[self.class_name][brightness_k]['u_normal'] = \
                                    np.array(np.matrix(np.dot(
                                        self.render_kernels[self.class_name][brightness_k]['u_view'].reshape(4,4),
                                        self.render_kernels[self.class_name][brightness_k]['u_model'].reshape(4,4))).I.T)
        self.render_kernels[self.class_name][brightness_k][
            'u_light_intensity'] = light_intensity

        app.run(framecount=0, framerate=0)
        rgb_buffer = np.zeros((self.height, self.width, 4), dtype=np.float32)
        gl.glReadPixels(0, 0, self.width, self.height, gl.GL_RGBA, gl.GL_FLOAT,
                        rgb_buffer)

        rgb_gl = np.copy(rgb_buffer)
        rgb_gl.shape = 480, 640, 4
        rgb_gl = rgb_gl[::-1, :]
        rgb_gl = np.round(rgb_gl[:, :, :3] * 255).astype(
            np.uint8)  # Convert to [0, 255]
        rgb_gl = rgb_gl[:, :, [2, 1, 0]]

        depth_buffer = np.zeros((self.height, self.width), dtype=np.float32)
        gl.glReadPixels(0, 0, self.width, self.height, gl.GL_DEPTH_COMPONENT,
                        gl.GL_FLOAT, depth_buffer)
        depth_gl = np.copy(depth_buffer)
        depth_gl.shape = 480, 640
        depth_gl = depth_gl[::-1, :]
        depth_bg = depth_gl == 1
        depth_gl = 2 * self.zFar * self.zNear / (self.zFar + self.zNear -
                                                 (self.zFar - self.zNear) *
                                                 (2 * depth_gl - 1))
        depth_gl[depth_bg] = 0
        return rgb_gl, depth_gl
def gen_render_real():
    for cls_idx, cls_name in idx2class.items():
        print(cls_idx, cls_name)
        if cls_name == 'driller':
            continue
        with open(
                os.path.join(real_set_dir,
                             'occLM_val_real_{}.txt'.format(cls_name)),
                'r') as f:
            all_indices = [line.strip('\r\n') for line in f.readlines()]

        # render machine
        model_dir = os.path.join(LM6d_root, 'models', cls_name)
        render_machine = Render_Py(model_dir, K, width, height, ZNEAR, ZFAR)

        for real_idx in tqdm(all_indices):
            video_name, prefix = real_idx.split('/')  # video name is "test"
            # read pose -------------------------------------
            real_meta_path = os.path.join(real_data_root,
                                          "02/{}-meta.mat".format(prefix))
            meta_data = sio.loadmat(real_meta_path)
            inner_id = np.where(
                np.squeeze(meta_data['cls_indexes']) == cls_idx)
            if len(meta_data['poses'].shape) == 2:
                pose = meta_data['poses']
            else:
                pose = np.squeeze(meta_data['poses'][:, :, inner_id])

            new_pose_path = os.path.join(render_real_root, cls_name,
                                         "{}-pose.txt".format(prefix))
            mkdir_if_missing(os.path.join(render_real_root, cls_name))
            # write pose
            write_pose_file(new_pose_path, cls_idx, pose)

            # ----------------------render color, depth ------------
            rgb_gl, depth_gl = render_machine.render(
                RT_transform.mat2quat(pose[:3, :3]), pose[:, -1])
            rgb_gl = rgb_gl.astype('uint8')
            render_color_path = os.path.join(render_real_root, cls_name,
                                             "{}-color.png".format(prefix))
            cv2.imwrite(render_color_path, rgb_gl)

            # depth
            depth_save = depth_gl * DEPTH_FACTOR
            depth_save = depth_save.astype('uint16')
            render_depth_path = os.path.join(render_real_root, cls_name,
                                             "{}-depth.png".format(prefix))
            cv2.imwrite(render_depth_path, depth_save)

            #--------------------- render label ----------------------------------
            render_label = depth_gl != 0
            render_label = render_label.astype('uint8')

            # write label
            label_path = os.path.join(render_real_root, cls_name,
                                      "{}-label.png".format(prefix))
            cv2.imwrite(label_path, render_label)