| 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(); |
| 530 | print_verbose("glTF: Total buffers: " + itos(state_buffers.size())); |
| 531 | |
| 532 | if (state_buffers.is_empty() || _all_buffers_empty(state_buffers)) { |
| 533 | ERR_FAIL_COND_V_MSG(!p_state->get_buffer_views().is_empty(), ERR_INVALID_DATA, "glTF: Buffer views are present, but buffers are empty."); |
| 534 | return OK; |
| 535 | } |
| 536 | Array buffers; |
| 537 | |
| 538 | for (GLTFBufferIndex i = 0; i < state_buffers.size(); i++) { |
| 539 | Vector<uint8_t> buffer_data = state_buffers[i]; |
| 540 | Dictionary gltf_buffer; |
| 541 | if (buffer_data.is_empty()) { |
| 542 | if (i < state_buffers.size() - 1 && !_all_buffers_empty(state_buffers, i + 1)) { |
| 543 | // have to push back a dummy buffer to avoid changing the buffer index |
| 544 | WARN_PRINT("glTF: Buffer " + itos(i) + " is empty, but there are non-empty subsequent buffers."); |
| 545 | gltf_buffer["byteLength"] = 0; |
| 546 | buffers.push_back(gltf_buffer); |
| 547 | } |
| 548 | continue; |
| 549 | } |
| 550 | String filename = p_path.get_basename().get_file() + itos(i) + ".bin"; |
| 551 | String path = p_path.get_base_dir() + "/" + filename; |
| 552 | Error err; |
| 553 | Ref<FileAccess> file = FileAccess::open(path, FileAccess::WRITE, &err); |
| 554 | if (file.is_null()) { |
| 555 | return err; |
| 556 | } |
| 557 | r_buffer_paths.push_back(path); |
| 558 | file->create(FileAccess::ACCESS_RESOURCES); |
| 559 | file->store_buffer(buffer_data.ptr(), buffer_data.size()); |
| 560 | gltf_buffer["uri"] = filename; |
| 561 | gltf_buffer["byteLength"] = buffer_data.size(); |
| 562 | buffers.push_back(gltf_buffer); |
| 563 | } |
| 564 | if (!buffers.is_empty()) { |
| 565 | p_state->get_json()["buffers"] = buffers; |
| 566 | } |
| 567 | |
| 568 | return OK; |
| 569 | } |
| 570 | |
| 571 | Error _serialize_file(Ref<GLTFState> p_state, const String p_path, Vector<String> &r_buffer_paths, bool p_force_single_precision) { |
| 572 | Error err = FAILED; |
no test coverage detected