Render one frame: LOD select -> overlays -> render -> return (H,W,3) uint8.
(self, scene: Scene, camera: Camera, frame_idx: int,
overlays: Optional[List[Overlay]] = None)
| 137 | self._active_extra_geoms: set = set() |
| 138 | |
| 139 | def render_frame(self, scene: Scene, camera: Camera, frame_idx: int, |
| 140 | overlays: Optional[List[Overlay]] = None) -> np.ndarray: |
| 141 | """Render one frame: LOD select -> overlays -> render -> return (H,W,3) uint8.""" |
| 142 | o3d = _import_open3d() |
| 143 | |
| 144 | vis_xyz, vis_rgb = scene.octree.lod_select( |
| 145 | camera.w2c(), |
| 146 | *camera.fov_intrinsics(self.width, self.height), |
| 147 | self.width, self.height, |
| 148 | self.config.near, self.config.far, |
| 149 | frame_idx, self.config.lod_target_pixels) |
| 150 | vis_frames = None |
| 151 | |
| 152 | extra_geoms = [] |
| 153 | if overlays: |
| 154 | for overlay in overlays: |
| 155 | vis_xyz, vis_rgb, geoms = overlay.apply( |
| 156 | scene, camera, frame_idx, vis_xyz, vis_rgb, vis_frames) |
| 157 | extra_geoms.extend(geoms) |
| 158 | |
| 159 | self._pcd_buf.points = o3d.utility.Vector3dVector(vis_xyz.astype(np.float64)) |
| 160 | self._pcd_buf.colors = o3d.utility.Vector3dVector( |
| 161 | np.clip(vis_rgb, 0, 1).astype(np.float64)) |
| 162 | |
| 163 | if hasattr(self._renderer.scene, 'update_geometry'): |
| 164 | flags = (o3d.visualization.rendering.Scene.UPDATE_POINTS_FLAG | |
| 165 | o3d.visualization.rendering.Scene.UPDATE_COLORS_FLAG) |
| 166 | self._renderer.scene.update_geometry('pcd', self._pcd_buf, flags) |
| 167 | else: |
| 168 | self._renderer.scene.remove_geometry('pcd') |
| 169 | self._renderer.scene.add_geometry('pcd', self._pcd_buf, self._mat) |
| 170 | |
| 171 | self._renderer.setup_camera( |
| 172 | camera.fov_deg, |
| 173 | camera.center.astype(np.float64), |
| 174 | camera.eye.astype(np.float64), |
| 175 | camera.up.astype(np.float64)) |
| 176 | |
| 177 | # EDL: clear stale overlays, grab point-cloud-only depth, |
| 178 | # then add current overlays |
| 179 | edl_depth = None |
| 180 | if self.config.edl: |
| 181 | self._update_extra_geoms([]) |
| 182 | edl_depth = np.asarray( |
| 183 | self._renderer.render_to_depth_image(z_in_view_space=True) |
| 184 | ).astype(np.float32) |
| 185 | |
| 186 | self._update_extra_geoms(extra_geoms) |
| 187 | |
| 188 | return self._render_and_postprocess(edl_depth) |
| 189 | |
| 190 | def render_frame_direct(self, vis_xyz: np.ndarray, vis_rgb: np.ndarray, |
| 191 | extra_geoms: list, camera: Camera) -> np.ndarray: |
no test coverage detected