| 258 | } |
| 259 | |
| 260 | std::string DracoCompressionEngine::compress(Mesh::Ptr mesh) const { |
| 261 | const size_t num_faces = mesh->get_num_faces(); |
| 262 | |
| 263 | draco::EncoderBuffer buffer; |
| 264 | draco::Encoder encoder; |
| 265 | if (num_faces > 0) { |
| 266 | auto draco_mesh = DracoCompressionEngineHelper::to_draco_mesh(mesh); |
| 267 | const auto status = encoder.EncodeMeshToBuffer(*draco_mesh, &buffer); |
| 268 | if (!status.ok()) { |
| 269 | throw RuntimeError("Draco encoding error!"); |
| 270 | } |
| 271 | return std::string(buffer.data(), buffer.size()); |
| 272 | } else { |
| 273 | auto draco_mesh = DracoCompressionEngineHelper::to_draco_point_cloud(mesh); |
| 274 | const auto status = encoder.EncodePointCloudToBuffer(*draco_mesh, &buffer); |
| 275 | if (!status.ok()) { |
| 276 | throw RuntimeError("Draco encoding error!"); |
| 277 | } |
| 278 | return std::string(buffer.data(), buffer.size()); |
| 279 | } |
| 280 | } |
| 281 | |
| 282 | Mesh::Ptr DracoCompressionEngine::decompress(const std::string& data) const { |
| 283 | draco::DecoderBuffer buffer; |