Revision: 21809
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21809
Author:   kjym3
Date:     2009-07-23 01:27:10 +0200 (Thu, 23 Jul 2009)

Log Message:
-----------
Second attempt for properly releasing temporary objects and their data
blocks in BlenderStrokeRenderer::~BlenderStrokeRenderer().

Modified Paths:
--------------
    
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp
    
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h

Modified: 
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp
===================================================================
--- 
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp
        2009-07-22 22:35:58 UTC (rev 21808)
+++ 
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp
        2009-07-22 23:27:10 UTC (rev 21809)
@@ -50,6 +50,8 @@
 
        // Scene.New("FreestyleStrokes")
        old_scene = G.scene;
+
+       objects.first = objects.last = NULL;
        
        ListBase lb;
        scene = add_scene("freestyle_strokes");
@@ -74,6 +76,8 @@
        object_camera->loc[2] = 1.0;
        
        scene->camera = object_camera;
+
+       store_object(object_camera);
        
        // Material
        material = add_material("stroke_material");
@@ -89,29 +93,46 @@
            _textureManager = 0;
          }
 
-       Base *base = (Base *)scene->base.first;
-       while(base) {
-               switch (base->object->type) {
+       // release scene
+       free_libblock( &G.main->scene, scene );
+
+       // release objects and data blocks
+       LinkData *link = (LinkData *)objects.first;
+       while(link) {
+               Object *ob = (Object *)link->data;
+               void *data = ob->data;
+               char name[24];
+               strcpy(name, ob->id.name);
+               //cout << "removing " << name[0] << name[1] << ":" << (name+2) 
<< endl;
+               switch (ob->type) {
                case OB_MESH:
-                       free_libblock( &G.main->mesh, base->object->data );
-                       free_libblock( &G.main->object, base->object );
+                       free_libblock( &G.main->object, ob );
+                       free_libblock( &G.main->mesh, data );
                        break;
                case OB_CAMERA:
-                       free_libblock( &G.main->camera, base->object->data );
-                       free_libblock( &G.main->object, base->object );
+                       free_libblock( &G.main->object, ob );
+                       free_libblock( &G.main->camera, data );
                        break;
                default:
-                       char *name = base->object->id.name;
                        cerr << "Warning: unexpected object in the scene: " << 
name[0] << name[1] << ":" << (name+2) << endl;
                }
-               base = base->next;
+               link = link->next;
        }
+       BLI_freelistN( &objects );
+
+       // release material
        free_libblock( &G.main->mat, material );
-       free_libblock( &G.main->scene, scene );
        
        set_scene_bg( old_scene );
 }
 
+void BlenderStrokeRenderer::store_object(Object *ob) const {
+
+       LinkData *link = (LinkData *)MEM_callocN(sizeof(LinkData), "temporary 
object" );
+       link->data = ob;
+       BLI_addhead(const_cast<ListBase *>(&objects), link);
+}
+
 void BlenderStrokeRenderer::RenderStrokeRep(StrokeRep *iStrokeRep) const{
   RenderStrokeRepBasic(iStrokeRep);
 }
@@ -138,12 +159,19 @@
                MEM_freeN(mesh->bb);
                mesh->bb= NULL;
                mesh->id.us = 0;
+
+               store_object(object_mesh);
                
+#if 1
                // me.materials = [mat]
                mesh->mat = ( Material ** ) MEM_mallocN( 1 * sizeof( Material * 
), "MaterialList" );
                mesh->mat[0] = material;
                mesh->totcol = 1;
                test_object_materials( (ID*) mesh );
+#else
+               assign_material(object_mesh, material, object_mesh->totcol+1);
+               object_mesh->actcol= object_mesh->totcol;
+#endif
                
                int strip_vertex_count = (*s)->sizeStrip();
        

Modified: 
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h
===================================================================
--- 
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h
  2009-07-22 22:35:58 UTC (rev 21808)
+++ 
branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h
  2009-07-22 23:27:10 UTC (rev 21809)
@@ -36,7 +36,9 @@
        Scene* scene;
        Scene* old_scene;
        Material* material;
+       ListBase objects;
 
+       void store_object(Object *ob) const;
 };
 
 #endif // BLENDERSTROKERENDERER_H


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

Reply via email to