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:
-rw-r--r--source/blender/blenkernel/BKE_object.h2
-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
-rw-r--r--source/blender/editors/mesh/editmesh_utils.c5
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c2
8 files changed, 58 insertions, 72 deletions
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 8870355a919..db93e4f419e 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -66,7 +66,7 @@ void BKE_object_free_bulletsoftbody(struct Object *ob);
void BKE_object_update_base_layer(struct Scene *scene, struct Object *ob);
void BKE_object_free(struct Object *ob);
-void BKE_object_free_display(struct Object *ob);
+void BKE_object_free_derived_caches(struct Object *ob);
bool BKE_object_support_modifier_type_check(struct Object *ob, int modifier_type);
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;
diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c
index 719c7ab95e3..40fda072180 100644
--- a/source/blender/editors/mesh/editmesh_utils.c
+++ b/source/blender/editors/mesh/editmesh_utils.c
@@ -374,6 +374,11 @@ void EDBM_mesh_load(Object *ob)
#ifdef USE_TESSFACE_DEFAULT
BKE_mesh_tessface_calc(me);
#endif
+
+ /* free derived mesh. usually this would happen through depsgraph but there
+ * are exceptions like file save that will not cause this, and we want to
+ * avoid ending up with an invalid derived mesh then */
+ BKE_object_free_derived_caches(ob);
}
/**
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index fce520d04fa..ee10adbf7db 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -4542,7 +4542,7 @@ void sculpt_pbvh_clear(Object *ob)
ss->pbvh = NULL;
if (dm)
dm->getPBVH(NULL, dm);
- BKE_object_free_display(ob);
+ BKE_object_free_derived_caches(ob);
}
void sculpt_update_after_dynamic_topology_toggle(bContext *C)