Previously, it was only possible to bake to disk with geometry nodes. This patch adds support for storing the baked data directly in the .blend file. By default, new bakes are stored in the .blend file now. Whether a new bake should be packed or stored on disk can be configured in two places: in the properties of the bake node and in the bake panel of the modifier. These settings don't affect existing bakes, only the next bake. To unpack or pack an individual bake, there is a new operator button next to the bake button. The icon and the label below indicate where the bake is currently stored. The label now also contains the size of the bake. To unpack or pack all bakes, the `File > External Data > Pack Resources / Unpack Resources` operators can be used. The unpack operator also has a new title that mentions the number if individual files separate from the number of bakes. This works better than just listing a number of files because a bake can consist of many files. Pull Request: https://projects.blender.org/blender/blender/pulls/124230
158 lines
5.0 KiB
C++
158 lines
5.0 KiB
C++
/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
#pragma once
|
|
|
|
/** \file
|
|
* \ingroup bke
|
|
*/
|
|
|
|
#include "BLI_implicit_sharing.hh"
|
|
#include "BLI_string_ref.hh"
|
|
|
|
#define RET_OK 0
|
|
#define RET_ERROR 1
|
|
|
|
struct BlendDataReader;
|
|
struct BlendWriter;
|
|
struct ID;
|
|
struct Image;
|
|
struct Main;
|
|
struct PackedFile;
|
|
struct ReportList;
|
|
struct VFont;
|
|
struct Volume;
|
|
struct bSound;
|
|
|
|
enum ePF_FileCompare {
|
|
PF_CMP_EQUAL = 0,
|
|
PF_CMP_DIFFERS = 1,
|
|
PF_CMP_NOFILE = 2,
|
|
};
|
|
|
|
enum ePF_FileStatus {
|
|
PF_WRITE_ORIGINAL = 3,
|
|
PF_WRITE_LOCAL = 4,
|
|
PF_USE_LOCAL = 5,
|
|
PF_USE_ORIGINAL = 6,
|
|
PF_KEEP = 7,
|
|
PF_REMOVE = 8,
|
|
|
|
PF_ASK = 10,
|
|
};
|
|
|
|
/* Pack. */
|
|
|
|
PackedFile *BKE_packedfile_duplicate(const PackedFile *pf_src);
|
|
PackedFile *BKE_packedfile_new(ReportList *reports,
|
|
const char *filepath_rel,
|
|
const char *basepath);
|
|
PackedFile *BKE_packedfile_new_from_memory(
|
|
const void *mem, int memlen, const blender::ImplicitSharingInfo *sharing_info = nullptr);
|
|
|
|
/**
|
|
* No libraries for now.
|
|
*/
|
|
void BKE_packedfile_pack_all(Main *bmain, ReportList *reports, bool verbose);
|
|
void BKE_packedfile_pack_all_libraries(Main *bmain, ReportList *reports);
|
|
|
|
/* Unpack. */
|
|
|
|
/**
|
|
* #BKE_packedfile_unpack_to_file() looks at the existing files (abs_name, local_name)
|
|
* and a packed file.
|
|
*
|
|
* It returns a char *to the existing file name / new file name or NULL when
|
|
* there was an error or when the user decides to cancel the operation.
|
|
*
|
|
* \warning 'abs_name' may be relative still! (use a "//" prefix)
|
|
* be sure to run #BLI_path_abs on it first.
|
|
*/
|
|
char *BKE_packedfile_unpack_to_file(ReportList *reports,
|
|
const char *ref_file_name,
|
|
const char *abs_name,
|
|
const char *local_name,
|
|
PackedFile *pf,
|
|
enum ePF_FileStatus how);
|
|
char *BKE_packedfile_unpack(Main *bmain,
|
|
ReportList *reports,
|
|
ID *id,
|
|
const char *orig_file_path,
|
|
PackedFile *pf,
|
|
enum ePF_FileStatus how);
|
|
int BKE_packedfile_unpack_vfont(Main *bmain,
|
|
ReportList *reports,
|
|
VFont *vfont,
|
|
enum ePF_FileStatus how);
|
|
int BKE_packedfile_unpack_sound(Main *bmain,
|
|
ReportList *reports,
|
|
bSound *sound,
|
|
enum ePF_FileStatus how);
|
|
int BKE_packedfile_unpack_image(Main *bmain,
|
|
ReportList *reports,
|
|
Image *ima,
|
|
enum ePF_FileStatus how);
|
|
int BKE_packedfile_unpack_volume(Main *bmain,
|
|
ReportList *reports,
|
|
Volume *volume,
|
|
enum ePF_FileStatus how);
|
|
void BKE_packedfile_unpack_all(Main *bmain, ReportList *reports, enum ePF_FileStatus how);
|
|
int BKE_packedfile_unpack_all_libraries(Main *bmain, ReportList *reports);
|
|
|
|
int BKE_packedfile_write_to_file(ReportList *reports,
|
|
const char *ref_file_name,
|
|
const char *filepath_rel,
|
|
PackedFile *pf);
|
|
|
|
/* Free. */
|
|
|
|
void BKE_packedfile_free(PackedFile *pf);
|
|
|
|
/* Info. */
|
|
|
|
struct PackedFileCount {
|
|
/** Counts e.g. packed images and sounds. */
|
|
int individual_files = 0;
|
|
/** Counts bakes that may consist of multiple files. */
|
|
int bakes = 0;
|
|
|
|
int total() const
|
|
{
|
|
return this->individual_files + this->bakes;
|
|
}
|
|
};
|
|
|
|
PackedFileCount BKE_packedfile_count_all(Main *bmain);
|
|
|
|
/**
|
|
* This function compares a packed file to a 'real' file.
|
|
* It returns an integer indicating if:
|
|
*
|
|
* - #PF_EQUAL: the packed file and original file are identical.
|
|
* - #PF_DIFFERENT: the packed file and original file differ.
|
|
* - #PF_NOFILE: the original file doesn't exist.
|
|
*/
|
|
ePF_FileCompare BKE_packedfile_compare_to_file(const char *ref_file_name,
|
|
const char *filepath_rel,
|
|
const PackedFile *pf);
|
|
|
|
/* Read. */
|
|
|
|
int BKE_packedfile_seek(PackedFile *pf, int offset, int whence);
|
|
void BKE_packedfile_rewind(PackedFile *pf);
|
|
int BKE_packedfile_read(PackedFile *pf, void *data, int size);
|
|
|
|
/**
|
|
* ID should be not NULL, return true if there's a packed file.
|
|
*/
|
|
bool BKE_packedfile_id_check(const ID *id);
|
|
/**
|
|
* ID should be not NULL, throws error when ID is Library.
|
|
*/
|
|
void BKE_packedfile_id_unpack(Main *bmain, ID *id, ReportList *reports, enum ePF_FileStatus how);
|
|
|
|
void BKE_packedfile_blend_write(BlendWriter *writer, const PackedFile *pf);
|
|
void BKE_packedfile_blend_read(BlendDataReader *reader,
|
|
PackedFile **pf_p,
|
|
blender::StringRefNull filepath);
|