/** * Free (or release) any data used by this ViewLayer. */ void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user) { view_layer->basact = NULL; BLI_freelistN(&view_layer->object_bases); if (view_layer->object_bases_hash) { BLI_ghash_free(view_layer->object_bases_hash, NULL, NULL); } for (LayerCollection *lc = view_layer->layer_collections.first; lc; lc = lc->next) { layer_collection_free(view_layer, lc); } BLI_freelistN(&view_layer->layer_collections); for (ViewLayerEngineData *sled = view_layer->drawdata.first; sled; sled = sled->next) { if (sled->storage) { if (sled->free) { sled->free(sled->storage); } MEM_freeN(sled->storage); } } BLI_freelistN(&view_layer->drawdata); MEM_SAFE_FREE(view_layer->stats); BKE_freestyle_config_free(&view_layer->freestyle_config, do_id_user); if (view_layer->id_properties) { IDP_FreeProperty(view_layer->id_properties); } MEM_SAFE_FREE(view_layer->object_bases_array); MEM_freeN(view_layer); }
/* do not free scene itself */ void BKE_scene_free(Scene *sce) { Base *base; SceneRenderLayer *srl; /* check all sequences */ BKE_sequencer_clear_scene_in_allseqs(G.main, sce); base = sce->base.first; while (base) { base->object->id.us--; base = base->next; } /* do not free objects! */ if (sce->gpd) { #if 0 /* removed since this can be invalid memory when freeing everything */ /* since the grease pencil data is freed before the scene. * since grease pencil data is not (yet?), shared between objects * its probably safe not to do this, some save and reload will free this. */ sce->gpd->id.us--; #endif sce->gpd = NULL; } BLI_freelistN(&sce->base); BKE_sequencer_editing_free(sce); BKE_free_animdata((ID *)sce); BKE_keyingsets_free(&sce->keyingsets); if (sce->rigidbody_world) BKE_rigidbody_free_world(sce->rigidbody_world); if (sce->r.avicodecdata) { free_avicodecdata(sce->r.avicodecdata); MEM_freeN(sce->r.avicodecdata); sce->r.avicodecdata = NULL; } if (sce->r.qtcodecdata) { free_qtcodecdata(sce->r.qtcodecdata); MEM_freeN(sce->r.qtcodecdata); sce->r.qtcodecdata = NULL; } if (sce->r.ffcodecdata.properties) { IDP_FreeProperty(sce->r.ffcodecdata.properties); MEM_freeN(sce->r.ffcodecdata.properties); sce->r.ffcodecdata.properties = NULL; } for (srl = sce->r.layers.first; srl; srl = srl->next) { BKE_freestyle_config_free(&srl->freestyleConfig); } BLI_freelistN(&sce->markers); BLI_freelistN(&sce->transform_spaces); BLI_freelistN(&sce->r.layers); if (sce->toolsettings) { if (sce->toolsettings->vpaint) { BKE_paint_free(&sce->toolsettings->vpaint->paint); MEM_freeN(sce->toolsettings->vpaint); } if (sce->toolsettings->wpaint) { BKE_paint_free(&sce->toolsettings->wpaint->paint); MEM_freeN(sce->toolsettings->wpaint); } if (sce->toolsettings->sculpt) { BKE_paint_free(&sce->toolsettings->sculpt->paint); MEM_freeN(sce->toolsettings->sculpt); } if (sce->toolsettings->uvsculpt) { BKE_paint_free(&sce->toolsettings->uvsculpt->paint); MEM_freeN(sce->toolsettings->uvsculpt); } BKE_paint_free(&sce->toolsettings->imapaint.paint); MEM_freeN(sce->toolsettings); sce->toolsettings = NULL; } DAG_scene_free(sce); if (sce->nodetree) { ntreeFreeTree(sce->nodetree); MEM_freeN(sce->nodetree); } if (sce->stats) MEM_freeN(sce->stats); if (sce->fps_info) MEM_freeN(sce->fps_info); sound_destroy_scene(sce); BKE_color_managed_view_settings_free(&sce->view_settings); }