| 377 | } |
| 378 | |
| 379 | bool Model::Save(bool withMeshDataFromGpu, Function<FlaxChunk*(int32)>& getChunk) const |
| 380 | { |
| 381 | if (ModelBase::Save(withMeshDataFromGpu, getChunk)) |
| 382 | return true; |
| 383 | |
| 384 | if (withMeshDataFromGpu) |
| 385 | { |
| 386 | // Download SDF data |
| 387 | if (SDF.Texture) |
| 388 | { |
| 389 | auto sdfChunk = getChunk(15); |
| 390 | if (sdfChunk == nullptr) |
| 391 | return true; |
| 392 | MemoryWriteStream sdfStream; |
| 393 | sdfStream.WriteInt32(1); // Version |
| 394 | ModelSDFHeader data(SDF, SDF.Texture->GetDescription()); |
| 395 | sdfStream.WriteBytes(&data, sizeof(data)); |
| 396 | TextureData sdfTextureData; |
| 397 | if (SDF.Texture->DownloadData(sdfTextureData)) |
| 398 | return true; |
| 399 | for (int32 mipLevel = 0; mipLevel < sdfTextureData.Items[0].Mips.Count(); mipLevel++) |
| 400 | { |
| 401 | auto& mip = sdfTextureData.Items[0].Mips[mipLevel]; |
| 402 | ModelSDFMip mipData(mipLevel, mip); |
| 403 | sdfStream.WriteBytes(&mipData, sizeof(mipData)); |
| 404 | sdfStream.WriteBytes(mip.Data.Get(), mip.Data.Length()); |
| 405 | } |
| 406 | sdfChunk->Data.Copy(ToSpan(sdfStream)); |
| 407 | } |
| 408 | } |
| 409 | else |
| 410 | { |
| 411 | if (SDF.Texture) |
| 412 | { |
| 413 | // SDF data from file (only if has no cached texture data) |
| 414 | if (LoadChunk(15)) |
| 415 | return true; |
| 416 | } |
| 417 | else |
| 418 | { |
| 419 | // No SDF texture |
| 420 | ReleaseChunk(15); |
| 421 | } |
| 422 | } |
| 423 | |
| 424 | return false; |
| 425 | } |
| 426 | |
| 427 | #endif |
| 428 |
no test coverage detected