diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2009-07-23 03:27:10 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2009-07-23 03:27:10 +0400 |
commit | 2bcb57f29b57e6fa0f056b346f657046b07b50ed (patch) | |
tree | 19c3e5ff9574400376e31560ac086a16e8036c6a /source/blender/freestyle | |
parent | 34744276d4134340afeed7ae9141d1667cb5e625 (diff) |
Second attempt for properly releasing temporary objects and their data
blocks in BlenderStrokeRenderer::~BlenderStrokeRenderer().
Diffstat (limited to 'source/blender/freestyle')
-rw-r--r-- | source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp | 48 | ||||
-rw-r--r-- | source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h | 2 |
2 files changed, 40 insertions, 10 deletions
diff --git a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp index 196a974bd9c..58d2bc5f77f 100644 --- a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp +++ b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp @@ -50,6 +50,8 @@ BlenderStrokeRenderer::BlenderStrokeRenderer() // Scene.New("FreestyleStrokes") old_scene = G.scene; + + objects.first = objects.last = NULL; ListBase lb; scene = add_scene("freestyle_strokes"); @@ -74,6 +76,8 @@ BlenderStrokeRenderer::BlenderStrokeRenderer() object_camera->loc[2] = 1.0; scene->camera = object_camera; + + store_object(object_camera); // Material material = add_material("stroke_material"); @@ -89,29 +93,46 @@ BlenderStrokeRenderer::~BlenderStrokeRenderer(){ _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 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const{ 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(); diff --git a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h index 8f4148bd047..2f7e192df5f 100644 --- a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h +++ b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h @@ -36,7 +36,9 @@ protected: Scene* scene; Scene* old_scene; Material* material; + ListBase objects; + void store_object(Object *ob) const; }; #endif // BLENDERSTROKERENDERER_H |