Blender V4.3
bake_items_paths.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
7#include "BLI_fileops.hh"
8#include "BLI_path_utils.hh"
9#include "BLI_string.h"
10#include "BLI_string_utils.hh"
11
12namespace blender::bke::bake {
13
14std::string frame_to_file_name(const SubFrame &frame)
15{
16 char file_name_c[FILE_MAX];
17 SNPRINTF(file_name_c, "%011.5f", double(frame));
18 BLI_string_replace_char(file_name_c, '.', '_');
19 return file_name_c;
20}
21
22std::optional<SubFrame> file_name_to_frame(const StringRef file_name)
23{
24 char modified_file_name[FILE_MAX];
25 file_name.copy(modified_file_name);
26 BLI_string_replace_char(modified_file_name, '_', '.');
27 try {
28 const SubFrame frame = std::stof(modified_file_name);
29 return frame;
30 }
31 catch (...) {
32 return std::nullopt;
33 }
34}
35
37{
38 if (!BLI_is_dir(meta_dir.c_str())) {
39 return {};
40 }
41
42 direntry *dir_entries = nullptr;
43 const int dir_entries_num = BLI_filelist_dir_contents(meta_dir.c_str(), &dir_entries);
44 BLI_SCOPED_DEFER([&]() { BLI_filelist_free(dir_entries, dir_entries_num); });
45
46 Vector<MetaFile> meta_files;
47 for (const int i : IndexRange(dir_entries_num)) {
48 const direntry &dir_entry = dir_entries[i];
49 const StringRefNull dir_entry_path = dir_entry.path;
50 if (!dir_entry_path.endswith(".json")) {
51 continue;
52 }
53 const std::optional<SubFrame> frame = file_name_to_frame(dir_entry.relname);
54 if (!frame) {
55 continue;
56 }
57 meta_files.append({*frame, dir_entry_path});
58 }
59
60 std::sort(meta_files.begin(), meta_files.end(), [](const MetaFile &a, const MetaFile &b) {
61 return a.frame < b.frame;
62 });
63
64 return meta_files;
65}
66
68{
69 char meta_dir[FILE_MAX];
70 BLI_path_join(meta_dir, sizeof(meta_dir), root_dir.c_str(), "meta");
71 char blobs_dir[FILE_MAX];
72 BLI_path_join(blobs_dir, sizeof(blobs_dir), root_dir.c_str(), "blobs");
73
74 BakePath bake_path;
75 bake_path.meta_dir = meta_dir;
76 bake_path.blobs_dir = blobs_dir;
77 bake_path.bake_dir = root_dir;
78 return bake_path;
79}
80
81} // namespace blender::bke::bake
unsigned int BLI_filelist_dir_contents(const char *dirname, struct direntry **r_filelist)
bool BLI_is_dir(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition storage.cc:433
void BLI_filelist_free(struct direntry *filelist, unsigned int nrentries)
File and directory operations.
#define BLI_SCOPED_DEFER(function_to_defer)
#define FILE_MAX
#define BLI_path_join(...)
#define SNPRINTF(dst, format,...)
Definition BLI_string.h:597
void BLI_string_replace_char(char *str, char src, char dst) ATTR_NONNULL(1)
void copy(char *dst, int64_t dst_size) const
constexpr bool endswith(StringRef suffix) const
constexpr const char * c_str() const
local_group_size(16, 16) .push_constant(Type b
std::optional< SubFrame > file_name_to_frame(const StringRef file_name)
Vector< MetaFile > find_sorted_meta_files(const StringRefNull meta_dir)
std::string frame_to_file_name(const SubFrame &frame)
static BakePath from_single_root(StringRefNull root_dir)
std::optional< std::string > bake_dir
const char * relname
const char * path