bugfix [#23164] Copied Scene Nodes!
copying a scene would still have nodes point back to the old scene which would crash (in some cases) or break rendering.
This commit is contained in:
parent
5f77852a47
commit
8c75853bb6
@ -136,6 +136,7 @@ void ntreeMakeOwnType(struct bNodeTree *ntree);
|
|||||||
void ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
|
void ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
|
||||||
void ntreeFreeTree(struct bNodeTree *ntree);
|
void ntreeFreeTree(struct bNodeTree *ntree);
|
||||||
struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select);
|
struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select);
|
||||||
|
void ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
|
||||||
void ntreeMakeLocal(struct bNodeTree *ntree);
|
void ntreeMakeLocal(struct bNodeTree *ntree);
|
||||||
|
|
||||||
void ntreeSocketUseFlags(struct bNodeTree *ntree);
|
void ntreeSocketUseFlags(struct bNodeTree *ntree);
|
||||||
|
@ -1064,6 +1064,7 @@ bNodeTree *ntreeAddTree(int type)
|
|||||||
* - internal_select is only 1 when used for duplicating selected nodes (i.e. Shift-D duplicate operator)
|
* - internal_select is only 1 when used for duplicating selected nodes (i.e. Shift-D duplicate operator)
|
||||||
* - this gets called when executing compositing updates (for threaded previews)
|
* - this gets called when executing compositing updates (for threaded previews)
|
||||||
* - when the nodetree datablock needs to be copied (i.e. when users get copied)
|
* - when the nodetree datablock needs to be copied (i.e. when users get copied)
|
||||||
|
* - for scene duplication use ntreeSwapID() after so we dont have stale pointers.
|
||||||
*/
|
*/
|
||||||
bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
|
bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
|
||||||
{
|
{
|
||||||
@ -1142,6 +1143,18 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
|
|||||||
return newtree;
|
return newtree;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* use when duplicating scenes */
|
||||||
|
void ntreeSwitchID(bNodeTree *ntree, ID *id_from, ID *id_to)
|
||||||
|
{
|
||||||
|
bNode *node;
|
||||||
|
/* for scene duplication only */
|
||||||
|
for(node= ntree->nodes.first; node; node= node->next) {
|
||||||
|
if(node->id==id_from) {
|
||||||
|
node->id= id_to;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* *************** preview *********** */
|
/* *************** preview *********** */
|
||||||
/* if node->preview, then we assume the rect to exist */
|
/* if node->preview, then we assume the rect to exist */
|
||||||
|
|
||||||
|
@ -173,7 +173,10 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type)
|
|||||||
BLI_duplicatelist(&(scen->r.layers), &(sce->r.layers));
|
BLI_duplicatelist(&(scen->r.layers), &(sce->r.layers));
|
||||||
BKE_keyingsets_copy(&(scen->keyingsets), &(sce->keyingsets));
|
BKE_keyingsets_copy(&(scen->keyingsets), &(sce->keyingsets));
|
||||||
|
|
||||||
scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
|
if(sce->nodetree) {
|
||||||
|
scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
|
||||||
|
ntreeSwitchID(scen->nodetree, &sce->id, &scen->id);
|
||||||
|
}
|
||||||
|
|
||||||
obase= sce->base.first;
|
obase= sce->base.first;
|
||||||
base= scen->base.first;
|
base= scen->base.first;
|
||||||
|
Loading…
Reference in New Issue
Block a user