[Bf-blender-cvs] [8ca52a7757f] temp_bmesh_multires: Merge branch 'master' into temp_bmesh_multires

Joseph Eagar noreply at git.blender.org
Tue Jun 8 01:57:43 CEST 2021


Commit: 8ca52a7757f308b813fdeb1e4edf4abed254b9a7
Author: Joseph Eagar
Date:   Mon Jun 7 16:57:33 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB8ca52a7757f308b813fdeb1e4edf4abed254b9a7

Merge branch 'master' into temp_bmesh_multires

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



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

diff --cc release/datafiles/locale
index 5ab29b1331d,2cef4877edc..4833954c0ac
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit 5ab29b1331d2103dae634b987f121c4599459d7f
 -Subproject commit 2cef4877edc40875978c4e95322bb5193f5815bf
++Subproject commit 4833954c0ac85cc407e1d5a153aa11b1d1823ec0
diff --cc source/blender/blenkernel/intern/collection.c
index 70787cf97ed,7b1aaf04640..9369c010dd6
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@@ -688,15 -688,13 +688,14 @@@ static Collection *collection_duplicate
  Collection *BKE_collection_duplicate(Main *bmain,
                                       Collection *parent,
                                       Collection *collection,
 -                                     eDupli_ID_Flags duplicate_flags,
 -                                     eLibIDDuplicateFlags duplicate_options)
 +                                     const uint duplicate_flags_in, //it's not const!! - joeedh
 +                                     const uint duplicate_options)
  {
    const bool is_subprocess = (duplicate_options & LIB_ID_DUPLICATE_IS_SUBPROCESS) != 0;
 +  uint duplicate_flags = duplicate_flags_in; 
  
    if (!is_subprocess) {
-     BKE_main_id_tag_all(bmain, LIB_TAG_NEW, false);
-     BKE_main_id_clear_newpoins(bmain);
+     BKE_main_id_newptr_and_tag_clear(bmain);
      /* In case root duplicated ID is linked, assume we want to get a local copy of it and duplicate
       * all expected linked data. */
      if (ID_IS_LINKED(collection)) {
diff --cc source/blender/blenkernel/intern/curve_bevel.c
index 911a98cb607,51418a6485f..a30fdadedaf
--- a/source/blender/blenkernel/intern/curve_bevel.c
+++ b/source/blender/blenkernel/intern/curve_bevel.c
@@@ -98,7 -98,7 +98,7 @@@ static void curve_bevel_make_extrude_an
     * for #Curve.bevresol is 32.  */
    float *quarter_coords_x = alloca(sizeof(float) * (cu->bevresol + 1));
    float *quarter_coords_y = alloca(sizeof(float) * (cu->bevresol + 1));
--  bevel_quarter_fill(cu, quarter_coords_x, quarter_coords_y);
++  bevel_quarter_fill((Curve *)cu, quarter_coords_x, quarter_coords_y);
  
    int nr;
    if (fill_type == FULL) {
diff --cc source/blender/blenkernel/intern/multires.c
index 3c6e70c505c,45ac20ef154..80de3748595
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@@ -874,456 -859,10 +874,450 @@@ typedef struct MultiresThreadedData 
    MDisps *mdisps;
    GridPaintMask *grid_paint_mask;
    int *gridOffset;
 +  int cd_mdisps_off, cd_mask_off;
    int gridSize, dGridSize, dSkip;
    float (*smat)[3];
 +  bool has_grid_mask;
  } MultiresThreadedData;
  
 +Object *multires_dump_grids_bmesh(Object *bmob, BMesh *bm)
 +{
 +  if (!CustomData_has_layer(&bm->ldata, CD_MDISPS)) {
 +    printf("multires_dump_grids_bmesh: error: no multires grids\n");
 +    return NULL;
 +  }
 +
 +  bool spaceset = false;
 +
 +  if (bm->multiresSpace != MULTIRES_SPACE_ABSOLUTE) {
 +    BKE_multires_bmesh_space_set(bmob, bm, MULTIRES_SPACE_ABSOLUTE);
 +    spaceset = true;
 +  }
 +
 +  Main *bmain = G.main;
 +  char *name = "multires_dump";
 +
 +  bContext *ctx = CTX_create();
 +  CTX_data_main_set(ctx, bmain);
 +  CTX_wm_manager_set(ctx, G.main->wm.first);
 +  CTX_data_scene_set(ctx, G.main->scenes.first);
 +
 +  ViewLayer *view_layer = CTX_data_view_layer(ctx);
 +  Object *ob = BKE_object_add_only_object(bmain, OB_MESH, name);
 +  LayerCollection *layer_collection;
 +
 +  ob->data = BKE_object_obdata_add_from_type(bmain, OB_MESH, name);
 +  DEG_id_tag_update_ex(
 +      bmain, &ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION);
 +  // DEG_id_tag_update_ex(
 +  //    bmain, &ob->data, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION);
 +
 +  layer_collection = BKE_layer_collection_get_active(view_layer);
 +  BKE_collection_object_add(bmain, layer_collection->collection, ob);
 +
 +  DEG_id_type_tag(bmain, ID_OB);
 +  DEG_relations_tag_update(bmain);
 +  if (ob->data != NULL) {
 +    DEG_id_tag_update_ex(bmain, (ID *)ob->data, ID_RECALC_EDITORS);
 +  }
 +
 +  ob->modifiers.first = ob->modifiers.last = NULL;
 +  zero_v3(ob->loc);
 +
 +  printf("users: %d\n", ob->id.us);
 +
 +  Mesh *me = ob->data;
 +
 +  BMIter iter;
 +  BMFace *f;
 +
 +  int cd_mdisp_off = CustomData_get_offset(&bm->ldata, CD_MDISPS);
 +  int dimen = 0;
 +
 +  BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
 +    BMLoop *l = f->l_first;
 +    MDisps *md = BM_ELEM_CD_GET_VOID_P(l, cd_mdisp_off);
 +    dimen = (int)floor(sqrt(md->totdisp) + 0.00001);
 +    break;
 +  }
 +
 +  if (!dimen) {
 +    printf("multires_dump_grids_bmesh: error: corrupted multires data\n");
 +    return NULL;
 +  }
 +
 +  int totvert = bm->totloop * dimen * dimen;
 +  int totface = bm->totloop * (dimen - 1) * (dimen - 1);
 +  int totloop = totface * 4;
 +
 +  CustomData_free(&me->vdata, me->totvert);
 +  CustomData_free(&me->edata, me->totedge);
 +  CustomData_free(&me->fdata, me->totface);
 +  CustomData_free(&me->ldata, me->totloop);
 +  CustomData_free(&me->pdata, me->totpoly);
 +
 +  me->totvert = totvert;
 +  me->totpoly = totface;
 +  me->totloop = totloop;
 +  me->totedge = totvert + totface;
 +  me->totface = 0;
 +  me->act_face = -1;
 +
 +  EdgeHash *eh = BLI_edgehash_new_ex("multires_dump_bmesh", me->totedge);
 +
 +  MVert *mvert = me->totvert ?
 +                     MEM_callocN(sizeof(MVert) * me->totvert, "multires_dump_grids_bmesh.vert") :
 +                     NULL;
 +  MEdge *medge = me->totedge ?
 +                     MEM_callocN(sizeof(MEdge) * me->totedge, "multires_dump_grids_bmesh.edge") :
 +                     NULL;
 +  MLoop *mloop = me->totloop ?
 +                     MEM_callocN(sizeof(MLoop) * me->totloop, "multires_dump_grids_bmesh.loop") :
 +                     NULL;
 +  MPoly *mpoly = me->totpoly ?
 +                     MEM_callocN(sizeof(MPoly) * me->totpoly, "multires_dump_grids_bmesh.poly") :
 +                     NULL;
 +
 +  me->cd_flag = 0;
 +
 +  CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, mvert, me->totvert);
 +  CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, medge, me->totedge);
 +  CustomData_add_layer(&me->ldata, CD_MLOOP, CD_ASSIGN, mloop, me->totloop);
 +  CustomData_add_layer(&me->pdata, CD_MPOLY, CD_ASSIGN, mpoly, me->totpoly);
 +
 +  BKE_mesh_update_customdata_pointers(me, 0);
 +
 +  int loopi = 0;
 +  int outli = 0;
 +  int medi = 0;
 +
 +#define VINDEX(i, j) (loopi * dimen * dimen + ((j)*dimen + (i)))
 +
 +  // CustomData_daata_
 +  BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
 +    BMLoop *l = f->l_first;
 +    do {
 +      MDisps *md = BM_ELEM_CD_GET_VOID_P(l, cd_mdisp_off);
 +
 +      for (int i = 0; i < dimen; i++) {
 +        for (int j = 0; j < dimen; j++) {
 +          int vidx = loopi * dimen * dimen + (j * dimen + i);
 +          int idx = j * dimen + i;
 +          float *co = md->disps[idx];
 +
 +          MVert *mv = mvert + vidx;
 +          copy_v3_v3(mv->co, co);
 +        }
 +      }
 +
 +      for (int i = 0; i < dimen - 1; i++) {
 +        for (int j = 0; j < dimen - 1; j++) {
 +          // do face
 +          int fidx = loopi * (dimen - 1) * (dimen - 1) + (j * (dimen - 1) + i);
 +          MPoly *mp = mpoly + fidx;
 +
 +          mp->totloop = 4;
 +          mp->loopstart = outli;
 +
 +          MLoop *ml = mloop + outli;
 +
 +          ml[0].v = VINDEX(i, j);
 +          ml[1].v = VINDEX(i, j + 1);
 +          ml[2].v = VINDEX(i + 1, j + 1);
 +          ml[3].v = VINDEX(i + 1, j);
 +
 +          for (int i2 = 0; i2 < 4; i2++) {
 +            int a = ml[i2].v, b = ml[(i2 + 1) % 4].v;
 +            int e;
 +
 +            if (!BLI_edgehash_haskey(eh, a, b)) {
 +              BLI_edgehash_insert(eh, a, b, (void *)medi);
 +              e = medi;
 +
 +              MEdge *med = medge + medi;
 +
 +              med->v1 = a;
 +              med->v2 = b;
 +
 +              medi++;
 +            }
 +            else {
 +              e = (int)BLI_edgehash_lookup(eh, a, b);
 +            }
 +
 +            ml[i2].e = e;
 +          }
 +
 +          outli += 4;
 +        }
 +      }
 +
 +      loopi++;
 +      l = l->next;
 +    } while (l != f->l_first);
 +  }
 +
 +  for (int i = 0; i < me->totpoly; i++) {
 +    if (!mpoly[i].totloop) {
 +      printf("error 1! %d %d\n", i, me->totpoly);
 +    }
 +    if (mpoly[i].loopstart >= me->totloop) {
 +      printf(
 +          "error 2! %d %d l: %d totl: %d\n", i, me->totpoly, mpoly[i].loopstart, mpoly[i].totloop);
 +    }
 +  }
 +
 +  if (spaceset) {
 +    BKE_multires_bmesh_space_set(bmob, bm, MULTIRES_SPACE_TANGENT);
 +  }
 +
 +  BKE_mesh_calc_normals(me);
 +  BKE_mesh_tessface_calc(me);
 +
 +  return ob;
 +}
 +
 +//#define LIMIT_MAX_DISPLACEMENT
 +
 +static void multires_bmesh_space_set_cb(void *__restrict userdata,
 +                                        const int pidx,
 +                                        const TaskParallelTLS *__restrict UNUSED(tls))
 +{
 +  MultiresThreadedData *tdata = userdata;
 +
 +  int cd_mdisps_off = tdata->cd_mdisps_off;
 +  BMesh *bm = tdata->bm;
 +  MultiResSpace op = tdata->bmop;
 +  BMFace *f = bm->ftable[pidx];
 +  int gridSize = tdata->gridSize;
 +
 +  int S, x, y;
 +
 +  BMLoop *l;
-   
++
 +#ifdef LIMIT_MAX_DISPLACEMENT
 +  l = f->l_first;
 +  float cent[3];
 +  int tot = 0;
 +
 +  // get face center to calculate maximum allowable displacement length
 +  zero_v3(cent);
 +  do {
 +    add_v3_v3(cent, l->v->co);
 +    tot++;
 +    l = l->next;
 +  } while (l != f->l_first);
 +
 +  mul_v3_fl(cent, 1.0f / (float)tot);
 +#endif
 +
 +  l = f->l_first;
 +  S = 0;
 +  do {
 +    MDisps *mdisp = BM_ELEM_CD_GET_VOID_P(l, cd_mdisps_off);
 +    float(*dispgrid)[3] = NULL;
 +
 +    dispgrid = mdisp->disps;
 +
-     /*try to limit numerical instability by clamping make displacement*/
- 
 +#ifdef LIMIT_MAX_DISPLACEMENT
++    /*try to limit numerical instability by clamping max displacement*/
++
 +    float maxlen = len_v3v3(l->v->co, cent) * 15.0f;
 +    maxlen = MAX2(maxlen, 0.00001f);
 +#endif
 +
 +    for (y = 0; y < gridSize; y++) {
 +      for (x = 0; x < gridSize; x++) {
 +        float sco[8], udv[3],

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list