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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-05-18 14:24:34 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-05-18 14:24:34 +0400
commit11186184aa7af143e72c539be0ed06c3ef37a146 (patch)
tree9be7e1160f0bcf9484526068327e99f237907b41 /source/blender/blenkernel/intern
parent8da43c5aaf5a0628da8f1523cc902ab82bdd5e20 (diff)
Fix #35404: crash in file save with python code that accesses mesh from panel.
On file save the mesh gets loads from the editmesh but the derived mesh caches wer not cleared. This usually happens through the depsgraph but it needs to be done manually here. Most changes are some refactoring to deduplicate derived mesh freeing code.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c38
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c2
-rw-r--r--source/blender/blenkernel/intern/multires.c7
-rw-r--r--source/blender/blenkernel/intern/object.c66
-rw-r--r--source/blender/blenkernel/intern/paint.c8
5 files changed, 51 insertions, 70 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 3dda6933eab..02de0ce1d40 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -2163,38 +2163,6 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D
MEM_freeN(deformedVerts);
}
-static void clear_mesh_caches(Object *ob)
-{
- Mesh *me = ob->data;
-
- /* also serves as signal to remake texspace */
- if (ob->bb) {
- MEM_freeN(ob->bb);
- ob->bb = NULL;
- }
- if (me->bb) {
- MEM_freeN(me->bb);
- me->bb = NULL;
- }
-
- BKE_displist_free(&ob->disp);
-
- if (ob->derivedFinal) {
- ob->derivedFinal->needsFree = 1;
- ob->derivedFinal->release(ob->derivedFinal);
- ob->derivedFinal = NULL;
- }
- if (ob->derivedDeform) {
- ob->derivedDeform->needsFree = 1;
- ob->derivedDeform->release(ob->derivedDeform);
- ob->derivedDeform = NULL;
- }
-
- if (ob->sculpt) {
- BKE_object_sculpt_modifiers_changed(ob);
- }
-}
-
static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask,
int build_shapekey_layers)
{
@@ -2205,7 +2173,8 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask,
BLI_assert(ob->type == OB_MESH);
- clear_mesh_caches(ob);
+ BKE_object_free_derived_caches(ob);
+ BKE_object_sculpt_modifiers_changed(ob);
mesh_calc_modifiers(scene, ob, NULL, &ob->derivedDeform,
&ob->derivedFinal, 0, 1,
@@ -2226,7 +2195,8 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask,
static void editbmesh_build_data(Scene *scene, Object *obedit, BMEditMesh *em, CustomDataMask dataMask)
{
- clear_mesh_caches(obedit);
+ BKE_object_free_derived_caches(obedit);
+ BKE_object_sculpt_modifiers_changed(obedit);
if (em->derivedFinal) {
if (em->derivedFinal != em->derivedCage) {
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 86832a72b90..03891f0fed3 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -1511,7 +1511,7 @@ static void flush_update_node(DagNode *node, unsigned int layer, int curtime)
if ((all_layer & layer) == 0) { // XXX && (ob != obedit)) {
/* but existing displaylists or derivedmesh should be freed */
if (ob->recalc & OB_RECALC_DATA)
- BKE_object_free_display(ob);
+ BKE_object_free_derived_caches(ob);
ob->recalc &= ~OB_RECALC_ALL;
}
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index c1f1ca0bbaa..7bd117ef7ce 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -373,11 +373,8 @@ void multires_mark_as_modified(Object *ob, MultiresModifiedFlags flags)
void multires_force_update(Object *ob)
{
if (ob) {
- if (ob->derivedFinal) {
- ob->derivedFinal->needsFree = 1;
- ob->derivedFinal->release(ob->derivedFinal);
- ob->derivedFinal = NULL;
- }
+ BKE_object_free_derived_caches(ob);
+
if (ob->sculpt && ob->sculpt->pbvh) {
BKE_pbvh_free(ob->sculpt->pbvh);
ob->sculpt->pbvh = NULL;
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 741c4f5429e..3779aa8cd88 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -241,20 +241,34 @@ void BKE_object_link_modifiers(struct Object *ob_dst, struct Object *ob_src)
/* TODO: smoke?, cloth? */
}
-/* here we will collect all local displist stuff */
-/* also (ab)used in depsgraph */
-void BKE_object_free_display(Object *ob)
+/* free data derived from mesh, called when mesh changes or is freed */
+void BKE_object_free_derived_caches(Object *ob)
{
- if (ob->derivedDeform) {
- ob->derivedDeform->needsFree = 1;
- ob->derivedDeform->release(ob->derivedDeform);
- ob->derivedDeform = NULL;
+ /* also serves as signal to remake texspace */
+ if (ob->type == OB_MESH) {
+ Mesh *me = ob->data;
+
+ if (me->bb) {
+ MEM_freeN(me->bb);
+ me->bb = NULL;
+ }
+ }
+
+ if (ob->bb) {
+ MEM_freeN(ob->bb);
+ ob->bb = NULL;
}
+
if (ob->derivedFinal) {
ob->derivedFinal->needsFree = 1;
ob->derivedFinal->release(ob->derivedFinal);
ob->derivedFinal = NULL;
}
+ if (ob->derivedDeform) {
+ ob->derivedDeform->needsFree = 1;
+ ob->derivedDeform->release(ob->derivedDeform);
+ ob->derivedDeform = NULL;
+ }
BKE_displist_free(&ob->disp);
}
@@ -264,7 +278,7 @@ void BKE_object_free(Object *ob)
{
int a;
- BKE_object_free_display(ob);
+ BKE_object_free_derived_caches(ob);
/* disconnect specific data, but not for lib data (might be indirect data, can get relinked) */
if (ob->data) {
@@ -2790,27 +2804,29 @@ void BKE_object_sculpt_modifiers_changed(Object *ob)
{
SculptSession *ss = ob->sculpt;
- if (!ss->cache) {
- /* we free pbvh on changes, except during sculpt since it can't deal with
- * changing PVBH node organization, we hope topology does not change in
- * the meantime .. weak */
- if (ss->pbvh) {
- BKE_pbvh_free(ss->pbvh);
- ss->pbvh = NULL;
- }
+ if (ss) {
+ if (!ss->cache) {
+ /* we free pbvh on changes, except during sculpt since it can't deal with
+ * changing PVBH node organization, we hope topology does not change in
+ * the meantime .. weak */
+ if (ss->pbvh) {
+ BKE_pbvh_free(ss->pbvh);
+ ss->pbvh = NULL;
+ }
- free_sculptsession_deformMats(ob->sculpt);
- }
- else {
- PBVHNode **nodes;
- int n, totnode;
+ free_sculptsession_deformMats(ob->sculpt);
+ }
+ else {
+ PBVHNode **nodes;
+ int n, totnode;
- BKE_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
+ BKE_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
- for (n = 0; n < totnode; n++)
- BKE_pbvh_node_mark_update(nodes[n]);
+ for (n = 0; n < totnode; n++)
+ BKE_pbvh_node_mark_update(nodes[n]);
- MEM_freeN(nodes);
+ MEM_freeN(nodes);
+ }
}
}
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 74542321a62..e8829c6216b 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -51,6 +51,7 @@
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_library.h"
+#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_pbvh.h"
#include "BKE_subsurf.h"
@@ -433,11 +434,8 @@ void sculptsession_bm_to_me_for_render(Object *object)
* here because this will lead to the while object
* surface to disappear, so we'll release DM in place.
*/
- if (object->derivedFinal) {
- object->derivedFinal->needsFree = 1;
- object->derivedFinal->release(object->derivedFinal);
- object->derivedFinal = NULL;
- }
+ BKE_object_free_derived_caches(object);
+
if (object->sculpt->pbvh) {
BKE_pbvh_free(object->sculpt->pbvh);
object->sculpt->pbvh = NULL;