[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21809] branches/soc-2008-mxcurioni/source /blender/freestyle/intern/stroke: Second attempt for properly releasing temporary objects and their data

Tamito Kajiyama rd6t-kjym at asahi-net.or.jp
Thu Jul 23 01:27:11 CEST 2009


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





More information about the Bf-blender-cvs mailing list