Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2009-07-23 03:27:10 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2009-07-23 03:27:10 +0400
commit2bcb57f29b57e6fa0f056b346f657046b07b50ed (patch)
tree19c3e5ff9574400376e31560ac086a16e8036c6a /source/blender/freestyle/intern
parent34744276d4134340afeed7ae9141d1667cb5e625 (diff)
Second attempt for properly releasing temporary objects and their data
blocks in BlenderStrokeRenderer::~BlenderStrokeRenderer().
Diffstat (limited to 'source/blender/freestyle/intern')
-rw-r--r--source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp48
-rw-r--r--source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h2
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