| 152 | } |
| 153 | |
| 154 | [[nodiscard]] std::optional<core::Tensor> renderSplatAssetPreview( |
| 155 | vis::RenderingManager& rendering_manager, |
| 156 | core::SplatData& splat, |
| 157 | const int width, |
| 158 | const int height, |
| 159 | const float focal_length_mm, |
| 160 | const glm::mat3* custom_rotation = nullptr, |
| 161 | const glm::vec3* custom_translation = nullptr) { |
| 162 | if (splat.size() == 0) { |
| 163 | return std::nullopt; |
| 164 | } |
| 165 | |
| 166 | Viewport preview_viewport( |
| 167 | static_cast<std::size_t>(width), |
| 168 | static_cast<std::size_t>(height)); |
| 169 | if (custom_rotation && custom_translation) { |
| 170 | preview_viewport.setViewMatrix(*custom_rotation, *custom_translation); |
| 171 | } else { |
| 172 | preview_viewport.camera.resetToHome(); |
| 173 | } |
| 174 | |
| 175 | vis::SceneRenderState scene_state; |
| 176 | scene_state.combined_model = &splat; |
| 177 | scene_state.model_transforms = { |
| 178 | rendering::dataWorldTransformToVisualizerWorld(glm::mat4(1.0f)), |
| 179 | }; |
| 180 | scene_state.transform_indices = std::make_shared<core::Tensor>( |
| 181 | core::Tensor::zeros( |
| 182 | {static_cast<std::size_t>(splat.size())}, |
| 183 | core::Device::CUDA, |
| 184 | core::DataType::Int32)); |
| 185 | scene_state.node_visibility_mask = {true}; |
| 186 | scene_state.selected_node_mask = {true}; |
| 187 | scene_state.visible_splat_count = 1; |
| 188 | |
| 189 | const auto image = rendering_manager.renderPreviewImage( |
| 190 | splat, |
| 191 | std::move(scene_state), |
| 192 | preview_viewport.getRotationMatrix(), |
| 193 | preview_viewport.getTranslation(), |
| 194 | focal_length_mm, |
| 195 | width, |
| 196 | height); |
| 197 | if (!image || !image->is_valid()) { |
| 198 | return std::nullopt; |
| 199 | } |
| 200 | return image->clone(); |
| 201 | } |
| 202 | |
| 203 | [[nodiscard]] std::optional<core::Tensor> renderPointCloudAssetPreview( |
| 204 | vis::RenderingManager& rendering_manager, |
no test coverage detected