Fix part of T60735: invalid CD_ORIGINDEX data in some modifier stack evaluations.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 28 Mar 2019 14:05:04 +0000 (15:05 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 28 Mar 2019 19:02:59 +0000 (20:02 +0100)
BKE_mesh_new_nomain automatically added a CD_ORIGINDEX layer initialized to 0,
which was never filled in correctly. In 2.7 the equivalent function used to
modify the source derivedmesh and add valid original indices to it, but this
is no longer possible in the new design and was quite unpredictable anyway.

Now instead rely on mesh_calc_modifiers and the depsgraph to determine when
CD_ORIGINDEX should be added.

source/blender/blenkernel/intern/mesh.c
source/blender/depsgraph/intern/builder/deg_builder_relations.cc
source/blender/modifiers/intern/MOD_ocean.c

index 4a3eb6adcf6b4e5793f2a3b5beed709a92e9ee1e..449c2f86b04bb1fb38f220a32614f99d2ff6fc87 100644 (file)
@@ -584,18 +584,6 @@ static void mesh_ensure_cdlayers_primary(Mesh *mesh, bool do_tessface)
        if (do_tessface && !CustomData_get_layer(&mesh->fdata, CD_MFACE))
                CustomData_add_layer(&mesh->fdata, CD_MFACE, CD_CALLOC, NULL, mesh->totface);
 }
-static void mesh_ensure_cdlayers_origindex(Mesh *mesh, bool do_tessface)
-{
-       if (!CustomData_get_layer(&mesh->vdata, CD_ORIGINDEX))
-               CustomData_add_layer(&mesh->vdata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totvert);
-       if (!CustomData_get_layer(&mesh->edata, CD_ORIGINDEX))
-               CustomData_add_layer(&mesh->edata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totedge);
-       if (!CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX))
-               CustomData_add_layer(&mesh->pdata, CD_ORIGINDEX, CD_CALLOC, NULL,  mesh->totpoly);
-
-       if (do_tessface && !CustomData_get_layer(&mesh->fdata, CD_ORIGINDEX))
-               CustomData_add_layer(&mesh->fdata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totface);
-}
 
 Mesh *BKE_mesh_new_nomain(int verts_len, int edges_len, int tessface_len, int loops_len, int polys_len)
 {
@@ -619,7 +607,6 @@ Mesh *BKE_mesh_new_nomain(int verts_len, int edges_len, int tessface_len, int lo
        mesh->totpoly = polys_len;
 
        mesh_ensure_cdlayers_primary(mesh, true);
-       mesh_ensure_cdlayers_origindex(mesh, true);
        BKE_mesh_update_customdata_pointers(mesh, false);
 
        return mesh;
@@ -662,7 +649,6 @@ static Mesh *mesh_new_nomain_from_template_ex(
        /* The destination mesh should at least have valid primary CD layers,
         * even in cases where the source mesh does not. */
        mesh_ensure_cdlayers_primary(me_dst, do_tessface);
-       mesh_ensure_cdlayers_origindex(me_dst, false);
        BKE_mesh_update_customdata_pointers(me_dst, false);
 
        return me_dst;
index 33850181f60358242688977ee4f44ae55010a318..f0c1dc8ffc3fa1087d3d9fb22f1b202e55a59c0a 100644 (file)
@@ -931,6 +931,11 @@ void DepsgraphRelationBuilder::build_object_parent(Object *object)
                 * so we onl;y hook up to transform channel here. */
                add_relation(parent_geometry_key, ob_key, "Parent");
        }
+
+       /* Dupliverts uses original vertex index. */
+       if (parent->transflag & OB_DUPLIVERTS) {
+               add_customdata_mask(parent, DEGCustomDataMeshMasks::MaskVert(CD_MASK_ORIGINDEX));
+       }
 }
 
 void DepsgraphRelationBuilder::build_object_pointcache(Object *object)
index b14e6d64ab06499c34caf07b8066b4ce7b7836e9..5e2183030db94ce0f61b25c5484e403c7167c9dd 100644 (file)
@@ -176,7 +176,6 @@ typedef struct GenerateOceanGeometryData {
        MVert *mverts;
        MPoly *mpolys;
        MLoop *mloops;
-       int *origindex;
        MLoopUV *mloopuvs;
 
        int res_x, res_y;
@@ -230,9 +229,6 @@ static void generate_ocean_geometry_polygons(
                mp->totloop = 4;
 
                mp->flag |= ME_SMOOTH;
-
-               /* generated geometry does not map to original faces */
-               gogd->origindex[fi] = ORIGINDEX_NONE;
        }
 }
 
@@ -299,8 +295,6 @@ static Mesh *generate_ocean_geometry(OceanModifierData *omd)
        gogd.mpolys = result->mpoly;
        gogd.mloops = result->mloop;
 
-       gogd.origindex = CustomData_get_layer(&result->pdata, CD_ORIGINDEX);
-
        ParallelRangeSettings settings;
        BLI_parallel_range_settings_defaults(&settings);
        settings.use_threading = use_threading;