| 481 | } |
| 482 | |
| 483 | Error _encode_buffer_glb(Ref<GLTFState> p_state, const String &p_path, Vector<String> &r_buffer_paths) { |
| 484 | auto state_buffers = p_state->get_buffers(); |
| 485 | print_verbose("glTF: Total buffers: " + itos(state_buffers.size())); |
| 486 | |
| 487 | if (state_buffers.is_empty() || _all_buffers_empty(state_buffers)) { |
| 488 | ERR_FAIL_COND_V_MSG(!p_state->get_buffer_views().is_empty(), ERR_INVALID_DATA, "glTF: Buffer views are present, but buffers are empty."); |
| 489 | return OK; |
| 490 | } |
| 491 | Array buffers; |
| 492 | Dictionary gltf_buffer; |
| 493 | |
| 494 | gltf_buffer["byteLength"] = state_buffers[0].size(); |
| 495 | buffers.push_back(gltf_buffer); |
| 496 | |
| 497 | for (GLTFBufferIndex i = 1; i < state_buffers.size() - 1; i++) { |
| 498 | Vector<uint8_t> buffer_data = state_buffers[i]; |
| 499 | if (buffer_data.is_empty()) { |
| 500 | if (i < state_buffers.size() - 1 && !_all_buffers_empty(state_buffers, i + 1)) { |
| 501 | // have to push back a dummy buffer to avoid changing the buffer index |
| 502 | WARN_PRINT("glTF: Buffer " + itos(i) + " is empty, but there are non-empty subsequent buffers."); |
| 503 | gltf_buffer["byteLength"] = 0; |
| 504 | buffers.push_back(gltf_buffer); |
| 505 | } |
| 506 | continue; |
| 507 | } |
| 508 | Dictionary gltf_buffer; |
| 509 | String filename = p_path.get_basename().get_file() + itos(i) + ".bin"; |
| 510 | String path = p_path.get_base_dir() + "/" + filename; |
| 511 | Error err; |
| 512 | Ref<FileAccess> file = FileAccess::open(path, FileAccess::WRITE, &err); |
| 513 | if (file.is_null()) { |
| 514 | return err; |
| 515 | } |
| 516 | r_buffer_paths.push_back(path); |
| 517 | file->create(FileAccess::ACCESS_RESOURCES); |
| 518 | file->store_buffer(buffer_data.ptr(), buffer_data.size()); |
| 519 | gltf_buffer["uri"] = filename; |
| 520 | gltf_buffer["byteLength"] = buffer_data.size(); |
| 521 | buffers.push_back(gltf_buffer); |
| 522 | } |
| 523 | p_state->get_json()["buffers"] = buffers; |
| 524 | |
| 525 | return OK; |
| 526 | } |
| 527 | |
| 528 | Error _encode_buffer_bins(Ref<GLTFState> p_state, const String &p_path, Vector<String> &r_buffer_paths) { |
| 529 | auto state_buffers = p_state->get_buffers(); |
no test coverage detected