Holds all mutable viewer state.
| 182 | |
| 183 | |
| 184 | class ViewerState: |
| 185 | """Holds all mutable viewer state.""" |
| 186 | |
| 187 | def __init__(self): |
| 188 | self.camera: Optional[OrbitCamera] = None |
| 189 | self.pcm: Optional[PointCloudManager] = None |
| 190 | self.animator = KeyframeAnimator() |
| 191 | |
| 192 | # Display params |
| 193 | self.frame_idx = 0 |
| 194 | self.display_mode = "all" |
| 195 | self.conf_threshold = 0.0 |
| 196 | self.point_size = 2.0 |
| 197 | self.background = [0.0, 0.0, 0.0] # black |
| 198 | self.render_width = 1280 |
| 199 | self.render_height = 720 |
| 200 | self.max_points = 5_000_000 # cap for interactive rendering |
| 201 | |
| 202 | # Octree LOD |
| 203 | self.octree = None # OctreeSPC instance |
| 204 | self.lod_target_pixels = 1.5 |
| 205 | self.near = 0.01 |
| 206 | self.far = 1000.0 |
| 207 | |
| 208 | # EDL post-processing |
| 209 | self.edl_enabled = True |
| 210 | self.edl_strength = 0.4 |
| 211 | self.edl_radius = 2 |
| 212 | |
| 213 | # Camera trail |
| 214 | self.show_trail = True |
| 215 | self.cam_positions = None # (S, 3) numpy array |
| 216 | |
| 217 | # Renderer |
| 218 | self._renderer = None |
| 219 | self._pcd = None |
| 220 | self._mat = None |
| 221 | self._dirty_geometry = True |
| 222 | self._dirty_camera = True |
| 223 | |
| 224 | def init_renderer(self, width: int, height: int): |
| 225 | o3d = _import_open3d() |
| 226 | self.render_width = width |
| 227 | self.render_height = height |
| 228 | self._renderer = o3d.visualization.rendering.OffscreenRenderer(width, height) |
| 229 | |
| 230 | cg = o3d.visualization.rendering.ColorGrading( |
| 231 | o3d.visualization.rendering.ColorGrading.Quality.ULTRA, |
| 232 | o3d.visualization.rendering.ColorGrading.ToneMapping.LINEAR, |
| 233 | ) |
| 234 | self._renderer.scene.view.set_color_grading(cg) |
| 235 | |
| 236 | bg = self.background |
| 237 | self._renderer.scene.set_background(np.array([bg[0], bg[1], bg[2], 1.0])) |
| 238 | |
| 239 | self._mat = o3d.visualization.rendering.MaterialRecord() |
| 240 | self._mat.shader = "defaultUnlit" |
| 241 | self._mat.point_size = self.point_size |