Fix T86026: Crash Opening Cryptomatte File.
But this time the root cause. Writing undo files is done in a separate thread. This patch moved the updating of the matte_id when the user actually changes the matte.
This commit is contained in:
@@ -208,6 +208,17 @@ void BKE_cryptomatte_matte_id_to_entries(NodeCryptomatte *node_storage, const ch
|
|||||||
BLI_freelistN(&node_storage->entries);
|
BLI_freelistN(&node_storage->entries);
|
||||||
std::optional<CryptomatteSession> session = std::nullopt;
|
std::optional<CryptomatteSession> session = std::nullopt;
|
||||||
|
|
||||||
|
if (matte_id == nullptr) {
|
||||||
|
MEM_SAFE_FREE(node_storage->matte_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* Update the matte_id so the files can be opened in versions that don't
|
||||||
|
* use `CryptomatteEntry`. */
|
||||||
|
if (matte_id != node_storage->matte_id && STREQ(node_storage->matte_id, matte_id)) {
|
||||||
|
MEM_SAFE_FREE(node_storage->matte_id);
|
||||||
|
node_storage->matte_id = static_cast<char *>(MEM_dupallocN(matte_id));
|
||||||
|
}
|
||||||
|
|
||||||
std::istringstream ss(matte_id);
|
std::istringstream ss(matte_id);
|
||||||
while (ss.good()) {
|
while (ss.good()) {
|
||||||
CryptomatteEntry *entry = nullptr;
|
CryptomatteEntry *entry = nullptr;
|
||||||
|
|||||||
@@ -540,18 +540,11 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree)
|
|||||||
}
|
}
|
||||||
else if ((ntree->type == NTREE_COMPOSIT) && (node->type == CMP_NODE_CRYPTOMATTE)) {
|
else if ((ntree->type == NTREE_COMPOSIT) && (node->type == CMP_NODE_CRYPTOMATTE)) {
|
||||||
NodeCryptomatte *nc = (NodeCryptomatte *)node->storage;
|
NodeCryptomatte *nc = (NodeCryptomatte *)node->storage;
|
||||||
/* Update the matte_id so the files can be opened in versions that don't
|
BLO_write_string(writer, nc->matte_id);
|
||||||
* use `CryptomatteEntry`. */
|
|
||||||
MEM_SAFE_FREE(nc->matte_id);
|
|
||||||
nc->matte_id = BKE_cryptomatte_entries_to_matte_id(nc);
|
|
||||||
if (nc->matte_id) {
|
|
||||||
BLO_write_string(writer, nc->matte_id);
|
|
||||||
}
|
|
||||||
LISTBASE_FOREACH (CryptomatteEntry *, entry, &nc->entries) {
|
LISTBASE_FOREACH (CryptomatteEntry *, entry, &nc->entries) {
|
||||||
BLO_write_struct(writer, CryptomatteEntry, entry);
|
BLO_write_struct(writer, CryptomatteEntry, entry);
|
||||||
}
|
}
|
||||||
BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage);
|
BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage);
|
||||||
MEM_SAFE_FREE(nc->matte_id);
|
|
||||||
}
|
}
|
||||||
else if (node->type == FN_NODE_INPUT_STRING) {
|
else if (node->type == FN_NODE_INPUT_STRING) {
|
||||||
NodeInputString *storage = (NodeInputString *)node->storage;
|
NodeInputString *storage = (NodeInputString *)node->storage;
|
||||||
|
|||||||
@@ -1469,7 +1469,6 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
BKE_cryptomatte_matte_id_to_entries(storage, storage->matte_id);
|
BKE_cryptomatte_matte_id_to_entries(storage, storage->matte_id);
|
||||||
MEM_SAFE_FREE(storage->matte_id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1070,7 +1070,8 @@ typedef struct CryptomatteEntry {
|
|||||||
typedef struct NodeCryptomatte {
|
typedef struct NodeCryptomatte {
|
||||||
float add[3];
|
float add[3];
|
||||||
float remove[3];
|
float remove[3];
|
||||||
char *matte_id DNA_DEPRECATED;
|
/* Stores `entries` as a string for opening in 2.80-2.91. */
|
||||||
|
char *matte_id;
|
||||||
/* Contains `CryptomatteEntry`. */
|
/* Contains `CryptomatteEntry`. */
|
||||||
ListBase entries;
|
ListBase entries;
|
||||||
int num_inputs;
|
int num_inputs;
|
||||||
|
|||||||
Reference in New Issue
Block a user