Commit: d77ec2153b77935ff66ca9a2176fb9bc4f7c5d32
Author: Antony Riakiotakis
Date:   Sat Apr 11 01:16:27 2015 +0200
Branches: GPU_data_request
https://developer.blender.org/rBd77ec2153b77935ff66ca9a2176fb9bc4f7c5d32

Fix crashes on undo when workflow has a nodetree.

Still getting memory leaks on exit, they likely occur because main is
owner of nodetree but we should give it to workflow instead.

===================================================================

M       source/blender/blenkernel/BKE_node.h
M       source/blender/blenkernel/intern/library.c
M       source/blender/blenkernel/intern/node.c
M       source/blender/blenkernel/intern/workflow_shaders.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/blenloader/intern/writefile.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_node.h 
b/source/blender/blenkernel/BKE_node.h
index 4059861..316212f 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -45,6 +45,7 @@
 #include "DNA_texture_types.h"
 #include "DNA_world_types.h"
 #include "DNA_linestyle_types.h"
+#include "DNA_view3d_types.h"
 
 #include "RNA_types.h"
 
@@ -665,6 +666,7 @@ struct NodeTreeIterStore {
        Lamp *lamp;
        World *world;
        FreestyleLineStyle *linestyle;
+       GPUWorkflowShader *wfshader;
 };
 
 void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main 
*bmain);
diff --git a/source/blender/blenkernel/intern/library.c 
b/source/blender/blenkernel/intern/library.c
index 07bdd41..52bec17 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -114,6 +114,7 @@
 #include "BKE_scene.h"
 #include "BKE_text.h"
 #include "BKE_texture.h"
+#include "BKE_workflow_shaders.h"
 #include "BKE_world.h"
 
 #include "RNA_access.h"
@@ -1036,6 +1037,9 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool 
do_id_user)
                case ID_PC:
                        BKE_paint_curve_free((PaintCurve *)id);
                        break;
+               case ID_GPUWS:
+                       BKE_workflow_shader_free((GPUWorkflowShader *)id);
+                       break;
        }
 
        /* avoid notifying on removed data */
diff --git a/source/blender/blenkernel/intern/node.c 
b/source/blender/blenkernel/intern/node.c
index 3ff570b1..063fc96 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -3698,6 +3698,7 @@ void BKE_node_tree_iter_init(struct NodeTreeIterStore 
*ntreeiter, struct Main *b
        ntreeiter->lamp = bmain->lamp.first;
        ntreeiter->world = bmain->world.first;
        ntreeiter->linestyle = bmain->linestyle.first;
+       ntreeiter->wfshader = bmain->gpuworkflows.first;
 }
 bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter,
                              bNodeTree **r_nodetree, struct ID **r_id)
@@ -3737,6 +3738,11 @@ bool BKE_node_tree_iter_step(struct NodeTreeIterStore 
*ntreeiter,
                *r_id       = (ID *)ntreeiter->linestyle;
                ntreeiter->linestyle = ntreeiter->linestyle->id.next;
        }
+       else if (ntreeiter->wfshader) {
+               *r_nodetree =       ntreeiter->wfshader->nodetree;
+               *r_id       = (ID *)ntreeiter->wfshader;
+               ntreeiter->wfshader = ntreeiter->wfshader->id.next;
+       }
        else {
                return false;
        }
diff --git a/source/blender/blenkernel/intern/workflow_shaders.c 
b/source/blender/blenkernel/intern/workflow_shaders.c
index 8a0ea05..1fb4cc7 100644
--- a/source/blender/blenkernel/intern/workflow_shaders.c
+++ b/source/blender/blenkernel/intern/workflow_shaders.c
@@ -33,12 +33,21 @@
 #include "DNA_object_types.h"
 
 #include "BKE_library.h"
+#include "BKE_node.h"
 #include "BKE_workflow_shaders.h"
 
+#include "MEM_guardedalloc.h"
+
 
 void BKE_workflow_shader_free(GPUWorkflowShader *shader)
 {
-
+       /* is no lib link block, but world extension */
+       if (shader->nodetree) {
+               /* will be freed once this is handled properly, currently this 
resides in nodetree list */
+               //ntreeFreeTree_ex(shader->nodetree, true);
+               //MEM_freeN(shader->nodetree);
+               //shader->nodetree = NULL;
+       }
 }
 
 struct GPUWorkflowShader *BKE_workflow_shader_add(struct Main *bmain, const 
char *name)
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index fedb93f..69c55aa 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -1952,23 +1952,6 @@ static void direct_link_palette(FileData *fd, Palette 
*palette)
        link_list(fd, &palette->colors);
 }
 
-static void lib_link_workflow_shader(FileData *UNUSED(fd), Main *main)
-{
-       GPUWorkflowShader *wfshader;
-
-       /* only link ID pointers */
-       for (wfshader = main->gpuworkflows.first; wfshader; wfshader = 
wfshader->id.next) {
-               if (wfshader->id.flag & LIB_NEED_LINK) {
-                       wfshader->id.flag -= LIB_NEED_LINK;
-               }
-       }
-}
-
-static void direct_link_workflow_shader(FileData *UNUSED(fd), 
GPUWorkflowShader *UNUSED(wfshader))
-{
-
-}
-
 static void lib_link_paint_curve(FileData *UNUSED(fd), Main *main)
 {
        PaintCurve *pc;
@@ -2525,6 +2508,7 @@ static bNodeTree *nodetree_from_id(ID *id)
                case ID_LA: return ((Lamp *)id)->nodetree;
                case ID_TE: return ((Tex *)id)->nodetree;
                case ID_LS: return ((FreestyleLineStyle *)id)->nodetree;
+               case ID_GPUWS: return ((GPUWorkflowShader *)id)->nodetree;
        }
        return NULL;
 }
@@ -3094,6 +3078,30 @@ static void direct_link_camera(FileData *fd, Camera *ca)
        direct_link_animdata(fd, ca->adt);
 }
 
+/*************** READ WORKFLOW SHADER *****************/
+
+static void lib_link_workflow_shader(FileData *fd, Main *main)
+{
+       GPUWorkflowShader *wfshader;
+
+       /* only link ID pointers */
+       for (wfshader = main->gpuworkflows.first; wfshader; wfshader = 
wfshader->id.next) {
+               if (wfshader->id.flag & LIB_NEED_LINK) {
+                       wfshader->id.flag -= LIB_NEED_LINK;
+
+                       if (wfshader->nodetree) {
+                               lib_link_ntree(fd, &wfshader->id, 
wfshader->nodetree);
+                               wfshader->nodetree->id.lib = wfshader->id.lib;
+                               wfshader->nodetree->view_center[0] = 0.0;
+                       }
+               }
+       }
+}
+
+static void direct_link_workflow_shader(FileData *fd, GPUWorkflowShader 
*wfshader)
+{
+       wfshader->nodetree = newdataadr(fd, wfshader->nodetree);
+}
 
 /* ************ READ LAMP ***************** */
 
@@ -6215,6 +6223,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen 
*curscreen, Scene *cursc
                                        if (v3d->camera == NULL)
                                                v3d->camera = sc->scene->camera;
                                        v3d->ob_centre = 
restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, USER_ONE);
+                                       v3d->activeworkflow = 
restore_pointer_by_name(newmain, (ID *)v3d->activeworkflow, USER_ONE);
                                        
                                        for (bgpic= v3d->bgpicbase.first; 
bgpic; bgpic= bgpic->next) {
                                                if ((bgpic->ima = 
restore_pointer_by_name(newmain, (ID *)bgpic->ima, USER_IGNORE))) {
diff --git a/source/blender/blenloader/intern/writefile.c 
b/source/blender/blenloader/intern/writefile.c
index f8c97af..1be3b81 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -3131,6 +3131,10 @@ static void write_gpuworkflows(WriteData *wd, ListBase 
*idbase)
        for (wfshader = idbase->first; wfshader; wfshader = wfshader->id.next) {
                if (wfshader->id.us > 0 || wd->current) {
                        writestruct(wd, ID_GPUWS, "GPUWorkflowShader", 1, 
wfshader);
+                       if (wfshader->nodetree) {
+                               writestruct(wd, DATA, "bNodeTree", 1, 
wfshader->nodetree);
+                               write_nodetree(wd, wfshader->nodetree);
+                       }
                        if (wfshader->id.properties) 
IDP_WriteProperty(wfshader->id.properties, wd);
                }
        }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to