(self, leds: list[LED3D], first=False)
| 95 | logger.debug("Renderer3D process initialised visualiser") |
| 96 | |
| 97 | def reload_geometry__(self, leds: list[LED3D], first=False): |
| 98 | |
| 99 | logger.debug("Renderer3D process reloading geometry") |
| 100 | |
| 101 | logger.debug(f"Fetched led map with size {len(leds)}") |
| 102 | all_views = get_all_views(leds) |
| 103 | |
| 104 | p, l, c = view_to_points_lines_colors(all_views) |
| 105 | |
| 106 | if self.point_cloud is None: |
| 107 | self.point_cloud = open3d.geometry.PointCloud() |
| 108 | if self.line_set is None: |
| 109 | self.line_set = open3d.geometry.LineSet() |
| 110 | if self.strip_set is None: |
| 111 | self.strip_set = open3d.geometry.LineSet() |
| 112 | |
| 113 | self.line_set.points = open3d.utility.Vector3dVector(p) |
| 114 | self.line_set.lines = open3d.utility.Vector2iVector(l) |
| 115 | self.line_set.colors = open3d.utility.Vector3dVector(c) |
| 116 | |
| 117 | self.point_cloud.points = open3d.utility.Vector3dVector( |
| 118 | np.array([led.point.position for led in leds]) |
| 119 | ) |
| 120 | self.point_cloud.normals = open3d.utility.Vector3dVector( |
| 121 | np.array([led.point.normal for led in leds]) * 0.2 |
| 122 | ) |
| 123 | self.point_cloud.colors = open3d.utility.Vector3dVector( |
| 124 | np.array([led.get_color() for led in leds]) |
| 125 | ) |
| 126 | |
| 127 | self.strip_set.points = self.point_cloud.points |
| 128 | |
| 129 | strips = [] |
| 130 | for led_index, led in enumerate(leds): |
| 131 | next_led = get_next(led, leds) |
| 132 | if next_led is not None and (next_led.led_id - led.led_id == 1): |
| 133 | if get_distance(led, next_led) < 1.50: # + 50% |
| 134 | strips.append((led_index, leds.index(next_led))) |
| 135 | |
| 136 | self.strip_set.lines = open3d.utility.Vector2iVector(strips) |
| 137 | self.strip_set.colors = open3d.utility.Vector3dVector( |
| 138 | [[0.8, 0.8, 0.8] for _ in range(len(self.strip_set.lines))] |
| 139 | ) |
| 140 | |
| 141 | if first: |
| 142 | self._vis.add_geometry( |
| 143 | open3d.geometry.TriangleMesh.create_coordinate_frame() |
| 144 | ) |
| 145 | # We only update the bounding box on the point cloud in case |
| 146 | # the camera has shot off into the distance |
| 147 | self._vis.add_geometry(self.point_cloud, reset_bounding_box=True) |
| 148 | self._vis.add_geometry(self.line_set, reset_bounding_box=False) |
| 149 | self._vis.add_geometry(self.strip_set, reset_bounding_box=False) |
| 150 | else: |
| 151 | self._vis.update_geometry(self.point_cloud) |
| 152 | self._vis.update_geometry(self.line_set) |
| 153 | self._vis.update_geometry(self.strip_set) |
| 154 |
no test coverage detected