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-01 18:34:12 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-05-01 18:34:12 +0400
commitc8cf9415dede94971252b545bf97ca0b46be70d1 (patch)
tree863d75aca580a039a7ad7daaa869f9dea5f1e479 /source/blender/blenkernel
parent04cbb3ad149563035e6606db48040e4ef00f1762 (diff)
Fix #35149: solidify modifier + vertex parent not working after going in and out
of editmode on the child object. Problem was that the object custom data mask was not taken into account when rebuilding the derivedmesh in some cases, which is needed for the derivedmesh to contain the mapping back to the original vertices. Now this data mask is used for any derivedmesh build that will be cached. Also problematic was that the datamask for the active object was applied to all objects in the scene, which caused the parent object to be recalculated when it didn't need to be. Now this datamask is only used for the active object.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c37
-rw-r--r--source/blender/blenkernel/intern/object.c2
2 files changed, 38 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 1860ea6d53f..dfd96de1e2b 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -2258,9 +2258,38 @@ static void editbmesh_build_data(Scene *scene, Object *obedit, BMEditMesh *em, C
em->derivedCage->needsFree = 0;
}
+static CustomDataMask object_get_datamask(Scene *scene, Object *ob)
+{
+ Object *actob = scene->basact ? scene->basact->object : NULL;
+ CustomDataMask mask = ob->customdata_mask;
+
+ if (ob == actob) {
+ /* check if we need tfaces & mcols due to face select or texture paint */
+ if (paint_facesel_test(ob) || (ob->mode & OB_MODE_TEXTURE_PAINT)) {
+ mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
+ }
+
+ /* check if we need mcols due to vertex paint or weightpaint */
+ if (ob->mode & OB_MODE_VERTEX_PAINT) {
+ mask |= CD_MASK_MCOL;
+ }
+
+ if (ob->mode & OB_MODE_WEIGHT_PAINT) {
+ mask |= CD_MASK_PREVIEW_MCOL;
+ }
+
+ if (ob->mode & OB_MODE_EDIT)
+ mask |= CD_MASK_MVERT_SKIN;
+ }
+
+ return mask;
+}
+
void makeDerivedMesh(Scene *scene, Object *ob, BMEditMesh *em,
CustomDataMask dataMask, int build_shapekey_layers)
{
+ dataMask |= object_get_datamask(scene, ob);
+
if (em) {
editbmesh_build_data(scene, ob, em, dataMask);
}
@@ -2276,6 +2305,8 @@ DerivedMesh *mesh_get_derived_final(Scene *scene, Object *ob, CustomDataMask dat
/* if there's no derived mesh or the last data mask used doesn't include
* the data we need, rebuild the derived mesh
*/
+ dataMask |= object_get_datamask(scene, ob);
+
if (!ob->derivedFinal || (dataMask & ob->lastDataMask) != dataMask)
mesh_build_data(scene, ob, dataMask, 0);
@@ -2287,6 +2318,8 @@ DerivedMesh *mesh_get_derived_deform(Scene *scene, Object *ob, CustomDataMask da
/* if there's no derived mesh or the last data mask used doesn't include
* the data we need, rebuild the derived mesh
*/
+ dataMask |= object_get_datamask(scene, ob);
+
if (!ob->derivedDeform || (dataMask & ob->lastDataMask) != dataMask)
mesh_build_data(scene, ob, dataMask, 0);
@@ -2377,6 +2410,8 @@ DerivedMesh *editbmesh_get_derived_cage_and_final(Scene *scene, Object *obedit,
/* if there's no derived mesh or the last data mask used doesn't include
* the data we need, rebuild the derived mesh
*/
+ dataMask |= object_get_datamask(scene, obedit);
+
if (!em->derivedCage ||
(em->lastDataMask & dataMask) != dataMask)
{
@@ -2392,6 +2427,8 @@ DerivedMesh *editbmesh_get_derived_cage(Scene *scene, Object *obedit, BMEditMesh
/* if there's no derived mesh or the last data mask used doesn't include
* the data we need, rebuild the derived mesh
*/
+ dataMask |= object_get_datamask(scene, obedit);
+
if (!em->derivedCage ||
(em->lastDataMask & dataMask) != dataMask)
{
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 0d577c25d79..04ff1b4d3c2 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -2727,7 +2727,7 @@ void BKE_object_handle_update_ex(Scene *scene, Object *ob,
#else /* ensure CD_MASK_BAREMESH for now */
BMEditMesh *em = (ob == scene->obedit) ? BKE_editmesh_from_object(ob) : NULL;
- uint64_t data_mask = scene->customdata_mask | ob->customdata_mask | CD_MASK_BAREMESH;
+ uint64_t data_mask = scene->customdata_mask | CD_MASK_BAREMESH;
if (em) {
makeDerivedMesh(scene, ob, em, data_mask, 0); /* was CD_MASK_BAREMESH */
}