[Bf-blender-cvs] [d11e357824d] master: Multires: Remove legacy compatibility code

Sergey Sharybin noreply at git.blender.org
Thu Oct 22 12:16:09 CEST 2020


Commit: d11e357824d607645a2e416c35b18bcfb5f5da11
Author: Sergey Sharybin
Date:   Thu Oct 22 12:05:48 2020 +0200
Branches: master
https://developer.blender.org/rBd11e357824d607645a2e416c35b18bcfb5f5da11

Multires: Remove legacy compatibility code

It was rather a huge chunk of code, which started to become
more harder to maintain with the transition to OpenSubdiv based
implementation. Because of this transition, the compatibility was
also rather on a poor side.

Remove compatibility support for pre-2.50.9 multires.

Ref T77107

Reviewed By: brecht, mont29

Differential Revision: https://developer.blender.org/D9238

===================================================================

M	source/blender/blenkernel/BKE_multires.h
M	source/blender/blenkernel/intern/mesh.c
M	source/blender/blenkernel/intern/multires.c
M	source/blender/blenloader/intern/versioning_250.c
M	source/blender/blenloader/intern/versioning_legacy.c
M	source/blender/makesdna/DNA_mesh_types.h
M	source/blender/makesdna/DNA_meshdata_types.h

===================================================================

diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
index fbdfc5b76a7..8ed3741c659 100644
--- a/source/blender/blenkernel/BKE_multires.h
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -36,7 +36,6 @@ struct DerivedMesh;
 struct MDisps;
 struct Mesh;
 struct ModifierData;
-struct Multires;
 struct MultiresModifierData;
 struct Object;
 struct Scene;
@@ -125,11 +124,6 @@ void multiresModifier_sync_levels_ex(struct Object *ob_dst,
 
 void multires_stitch_grids(struct Object *);
 
-/* Related to the old multires */
-void multires_free(struct Multires *mr);
-void multires_load_old(struct Object *ob, struct Mesh *me);
-void multires_load_old_250(struct Mesh *);
-
 void multiresModifier_scale_disp(struct Depsgraph *depsgraph,
                                  struct Scene *scene,
                                  struct Object *ob);
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 6ea83cf4330..97520654e7b 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -275,50 +275,6 @@ static void mesh_blend_read_data(BlendDataReader *reader, ID *id)
     mesh->totselect = 0;
   }
 
-  /* Multires data */
-  BLO_read_data_address(reader, &mesh->mr);
-  if (mesh->mr) {
-    BLO_read_list(reader, &mesh->mr->levels);
-    MultiresLevel *lvl = mesh->mr->levels.first;
-
-    CustomData_blend_read(reader, &mesh->mr->vdata, lvl->totvert);
-    BKE_defvert_blend_read(
-        reader, lvl->totvert, CustomData_get(&mesh->mr->vdata, 0, CD_MDEFORMVERT));
-    CustomData_blend_read(reader, &mesh->mr->fdata, lvl->totface);
-
-    BLO_read_data_address(reader, &mesh->mr->edge_flags);
-    BLO_read_data_address(reader, &mesh->mr->edge_creases);
-
-    BLO_read_data_address(reader, &mesh->mr->verts);
-
-    /* If mesh has the same number of vertices as the
-     * highest multires level, load the current mesh verts
-     * into multires and discard the old data. Needed
-     * because some saved files either do not have a verts
-     * array, or the verts array contains out-of-date
-     * data. */
-    if (mesh->totvert == ((MultiresLevel *)mesh->mr->levels.last)->totvert) {
-      if (mesh->mr->verts) {
-        MEM_freeN(mesh->mr->verts);
-      }
-      mesh->mr->verts = MEM_dupallocN(mesh->mvert);
-    }
-
-    for (; lvl; lvl = lvl->next) {
-      BLO_read_data_address(reader, &lvl->verts);
-      BLO_read_data_address(reader, &lvl->faces);
-      BLO_read_data_address(reader, &lvl->edges);
-      BLO_read_data_address(reader, &lvl->colfaces);
-    }
-  }
-
-  /* if multires is present but has no valid vertex data,
-   * there's no way to recover it; silently remove multires */
-  if (mesh->mr && !mesh->mr->verts) {
-    multires_free(mesh->mr);
-    mesh->mr = NULL;
-  }
-
   if ((BLO_read_requires_endian_switch(reader)) && mesh->tface) {
     TFace *tf = mesh->tface;
     for (int i = 0; i < mesh->totface; i++, tf++) {
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 6e1168d8a16..bd9b1b24844 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -1449,9 +1449,6 @@ DerivedMesh *multires_make_derived_from_derived(
   return result;
 }
 
-/**** Old Multires code ****
- ***************************/
-
 /* Adapted from sculptmode.c */
 void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u, float v)
 {
@@ -1506,723 +1503,6 @@ void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u,
   add_v3_v3v3(out, d2[0], d2[1]);
 }
 
-static void old_mdisps_rotate(
-    int S, int UNUSED(newside), int oldside, int x, int y, float *u, float *v)
-{
-  float offset = oldside * 0.5f - 0.5f;
-
-  if (S == 1) {
-    *u = offset + x;
-    *v = offset - y;
-  }
-  if (S == 2) {
-    *u = offset + y;
-    *v = offset + x;
-  }
-  if (S == 3) {
-    *u = offset - x;
-    *v = offset + y;
-  }
-  if (S == 0) {
-    *u = offset - y;
-    *v = offset - x;
-  }
-}
-
-static void old_mdisps_convert(MFace *mface, MDisps *mdisp)
-{
-  int newlvl = log(sqrt(mdisp->totdisp) - 1) / M_LN2;
-  int oldlvl = newlvl + 1;
-  int oldside = multires_side_tot[oldlvl];
-  int newside = multires_side_tot[newlvl];
-  int nvert = (mface->v4) ? 4 : 3;
-  int newtotdisp = multires_grid_tot[newlvl] * nvert;
-  int x, y, S;
-  float(*disps)[3], (*out)[3], u = 0.0f, v = 0.0f; /* Quite gcc barking. */
-
-  disps = MEM_calloc_arrayN(newtotdisp, sizeof(float[3]), "multires disps");
-
-  out = disps;
-  for (S = 0; S < nvert; S++) {
-    for (y = 0; y < newside; y++) {
-      for (x = 0; x < newside; x++, out++) {
-        old_mdisps_rotate(S, newside, oldside, x, y, &u, &v);
-        old_mdisps_bilinear(*out, mdisp->disps, oldside, u, v);
-
-        if (S == 1) {
-          (*out)[1] = -(*out)[1];
-        }
-        else if (S == 2) {
-          SWAP(float, (*out)[0], (*out)[1]);
-        }
-        else if (S == 3) {
-          (*out)[0] = -(*out)[0];
-        }
-        else if (S == 0) {
-          SWAP(float, (*out)[0], (*out)[1]);
-          (*out)[0] = -(*out)[0];
-          (*out)[1] = -(*out)[1];
-        }
-      }
-    }
-  }
-
-  MEM_freeN(mdisp->disps);
-
-  mdisp->totdisp = newtotdisp;
-  mdisp->level = newlvl;
-  mdisp->disps = disps;
-}
-
-void multires_load_old_250(Mesh *me)
-{
-  MDisps *mdisps, *mdisps2;
-  MFace *mf;
-  int i, j, k;
-
-  mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
-
-  if (mdisps) {
-    for (i = 0; i < me->totface; i++) {
-      if (mdisps[i].totdisp) {
-        old_mdisps_convert(&me->mface[i], &mdisps[i]);
-      }
-    }
-
-    CustomData_add_layer(&me->ldata, CD_MDISPS, CD_CALLOC, NULL, me->totloop);
-    mdisps2 = CustomData_get_layer(&me->ldata, CD_MDISPS);
-
-    k = 0;
-    mf = me->mface;
-    for (i = 0; i < me->totface; i++, mf++) {
-      int nvert = mf->v4 ? 4 : 3;
-      int totdisp = mdisps[i].totdisp / nvert;
-
-      for (j = 0; j < nvert; j++, k++) {
-        mdisps2[k].disps = MEM_calloc_arrayN(
-            totdisp, sizeof(float[3]), "multires disp in conversion");
-        mdisps2[k].totdisp = totdisp;
-        mdisps2[k].level = mdisps[i].level;
-        memcpy(mdisps2[k].disps, mdisps[i].disps + totdisp * j, totdisp);
-      }
-    }
-  }
-}
-
-/* Does not actually free lvl itself */
-static void multires_free_level(MultiresLevel *lvl)
-{
-  if (lvl) {
-    if (lvl->faces) {
-      MEM_freeN(lvl->faces);
-    }
-    if (lvl->edges) {
-      MEM_freeN(lvl->edges);
-    }
-    if (lvl->colfaces) {
-      MEM_freeN(lvl->colfaces);
-    }
-  }
-}
-
-void multires_free(Multires *mr)
-{
-  if (mr) {
-    MultiresLevel *lvl = mr->levels.first;
-
-    /* Free the first-level data */
-    if (lvl) {
-      CustomData_free(&mr->vdata, lvl->totvert);
-      CustomData_free(&mr->fdata, lvl->totface);
-      if (mr->edge_flags) {
-        MEM_freeN(mr->edge_flags);
-      }
-      if (mr->edge_creases) {
-        MEM_freeN(mr->edge_creases);
-      }
-    }
-
-    while (lvl) {
-      multires_free_level(lvl);
-      lvl = lvl->next;
-    }
-
-    /* mr->verts may be NULL when loading old files,
-     * see direct_link_mesh() in readfile.c, and T43560. */
-    MEM_SAFE_FREE(mr->verts);
-
-    BLI_freelistN(&mr->levels);
-
-    MEM_freeN(mr);
-  }
-}
-
-typedef struct IndexNode {
-  struct IndexNode *next, *prev;
-  int index;
-} IndexNode;
-
-static void create_old_vert_face_map(ListBase **map,
-                                     IndexNode **mem,
-                                     const MultiresFace *mface,
-                                     const int totvert,
-                                     const int totface)
-{
-  int i, j;
-  IndexNode *node = NULL;
-
-  (*map) = MEM_calloc_arrayN(totvert, sizeof(ListBase), "vert face map");
-  (*mem) = MEM_calloc_arrayN(totface, sizeof(IndexNode[4]), "vert face map mem");
-  node = *mem;
-
-  /* Find the users */
-  for (i = 0; i < totface; i++) {
-    for (j = 0; j < (mface[i].v[3] ? 4 : 3); j++, node++) {
-      node->index = i;
-      BLI_addtail(&(*map)[mface[i].v[j]], node);
-    }
-  }
-}
-
-static void create_old_vert_edge_map(ListBase **map,
-                                     IndexNode **mem,
-                                     const MultiresEdge *medge,
-                                     const int totvert,
-                                     const int totedge)
-{
-  int i, j;
-  IndexNode *node = NULL;
-
-  (*map) = MEM_calloc_arrayN(totvert, sizeof(ListBase), "vert edge map");
-  (*mem) = MEM_calloc_arrayN(totedge, sizeof(IndexNode[2]), "vert edge map mem");
-  node = *mem;
-
-  /* Find the users */
-  for (i = 0; i < totedge; i++) {
-    for (j = 0; j < 2; j++, node++) {
-      node->index = i;
-      BLI_addtail(&(*map)[medge[i].v[j]], node);
-    }
-  }
-}
-
-static MultiresFace *find_old_face(
-    ListBase *map, MultiresFace *faces, int v1, int v2, int v3, int v4)
-{
-  IndexNode *n1;
-  int v[4], i, j;
-
-  v[0] = v1;
-  v[1] = v2;
-  v[2] = v3;
-  v[3] = v4;
-
-  for (n1 = map[v1].first; n1; n1 = n1->next) {
-    int fnd[4] = {0, 0, 0, 0};
-
-    for (i = 0; i < 4; i++) {
-      for (j = 0; j < 4; j++) {
-        if (v[i] == faces[n1->index].v[j]) {
-          fnd[i] = 1;
-        }
-      }
-    }
-
-    if (fnd[0] && fnd[1] && fnd[2] && fnd[3]) {
-      return &faces[n1->index];
-    }
-  }
-
-  return NULL;
-}
-
-static MultiresEdge *find_old_edge(ListBase *map, MultiresEdge *edges, int v1, int v2)
-{
-  IndexNode *n1, *n2;
-
-  for (n1 = map[v1].first; n1; n1 = n1->next) {
-    for (n2 = map[v2].first; n2; n2 = n2->next) {
-      if (n1->index == n2->index) {
-        return &edges[n1->index];
-      }
-    }
-  }
-
-  return NULL;
-}
-
-static void multires_load_old_edges(
-    ListBase **emap, MultiresLevel *lvl, int *vvmap, int dst, int v1, int v2, int mov)
-{
-  int emid = find_old_edge(emap[2], lvl->edges, v1, v2)->mid;
-  vvmap[dst + mov] = emid;
-
-  if (lvl->next->next) {
-    multires_load_old_edges(emap + 1, lvl->next, vvmap, dst + mov, v1, emid, mov / 2);
-    multires_load_old_edges(emap + 1, lvl->next, vvmap, dst + mov, v2, emid, -mov / 2);
-  }
-}
-
-static void multires

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list