| 201 | } |
| 202 | |
| 203 | [[nodiscard]] std::optional<core::Tensor> renderPointCloudAssetPreview( |
| 204 | vis::RenderingManager& rendering_manager, |
| 205 | const core::PointCloud& point_cloud, |
| 206 | const int width, |
| 207 | const int height, |
| 208 | const float focal_length_mm, |
| 209 | const glm::mat3* custom_rotation = nullptr, |
| 210 | const glm::vec3* custom_translation = nullptr) { |
| 211 | if (point_cloud.size() == 0) { |
| 212 | return std::nullopt; |
| 213 | } |
| 214 | |
| 215 | auto* const engine = rendering_manager.getRenderingEngine(); |
| 216 | if (!engine) { |
| 217 | return std::nullopt; |
| 218 | } |
| 219 | |
| 220 | Viewport preview_viewport( |
| 221 | static_cast<std::size_t>(width), |
| 222 | static_cast<std::size_t>(height)); |
| 223 | if (custom_rotation && custom_translation) { |
| 224 | preview_viewport.setViewMatrix(*custom_rotation, *custom_translation); |
| 225 | } else { |
| 226 | preview_viewport.camera.resetToHome(); |
| 227 | } |
| 228 | |
| 229 | std::vector<glm::mat4> model_transforms{ |
| 230 | rendering::dataWorldTransformToVisualizerWorld(glm::mat4(1.0f)), |
| 231 | }; |
| 232 | auto transform_indices = std::make_shared<core::Tensor>( |
| 233 | core::Tensor::zeros( |
| 234 | {static_cast<std::size_t>(point_cloud.size())}, |
| 235 | core::Device::CUDA, |
| 236 | core::DataType::Int32)); |
| 237 | |
| 238 | rendering::PointCloudRenderRequest request{}; |
| 239 | request.frame_view.rotation = preview_viewport.getRotationMatrix(); |
| 240 | request.frame_view.translation = preview_viewport.getTranslation(); |
| 241 | request.frame_view.size = {width, height}; |
| 242 | request.frame_view.focal_length_mm = focal_length_mm; |
| 243 | request.render.scaling_modifier = 1.0f; |
| 244 | request.render.voxel_size = 0.01f; |
| 245 | request.render.equirectangular = false; |
| 246 | request.scene.model_transforms = &model_transforms; |
| 247 | request.scene.transform_indices = std::move(transform_indices); |
| 248 | request.scene.node_visibility_mask = {true}; |
| 249 | request.transparent_background = false; |
| 250 | |
| 251 | auto render_result = engine->renderPointCloudImage(point_cloud, request); |
| 252 | if (!render_result || !render_result->image || !render_result->image->is_valid()) { |
| 253 | if (!render_result) { |
| 254 | LOG_DEBUG("Point-cloud asset preview render failed: {}", render_result.error()); |
| 255 | } |
| 256 | return std::nullopt; |
| 257 | } |
| 258 | return render_result->image->clone(); |
| 259 | } |
| 260 |
no test coverage detected